ZGlmZiAtLWdpdCBhL0NIQU5HRUxPRyBiL0NIQU5HRUxPRwppbmRleCA3YTVhYjU4Li5jM2I2ODQ4IDEwMDY0NAotLS0gYS9DSEFOR0VMT0cKKysrIGIvQ0hBTkdFTE9HCkBAIC0yLDYgKzIsMzAgQEAKIENoYW5nZXMgZm9yIFUtQm9vdCAxLjEuMzoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorKiBBZGQgY29tbW9uICh3aXRoIExpbnV4KSBNVEQgcGFydGl0aW9uIHNjaGVtZSBhbmQgIm10ZHBhcnRzIiBjb21tYW5kCisKKyAgT2xkLCBvYnNvbGV0ZSBhbmQgZHVwbGljYXRlZCBjb2RlIHdhcyBjbGVhbmVkIHVwIGFuZCByZXBsYWNlIGJ5IHRoZQorICBuZXcgcGFydGl0aW9uaW5nIG1ldGhvZC4gVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBhcHByb2FjaGVzIG5vdzoKKworICBUaGUgZmlyc3Qgb25lIGlzIHRvIGRlZmluZSBhIHNpbmdsZSwgc3RhdGljIHBhcnRpdGlvbjoKKworICAjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyAgI2RlZmluZSBDT05GSUdfSkZGUzJfREVWICAgICAgICAgICAgICAgIm5vcjAiCisgICNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRSAgICAgICAgIDB4RkZGRkZGRkYJLyogdXNlIHdob2xlIGRldmljZSAqLworICAjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUgICAgICAgICAweDAwMTAwMDAwCS8qIHVzZSAxTUIgKi8KKyAgI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQgICAgICAgMHgwMDAwMDAwMAorCisgIFRoZSBzZWNvbmQgbWV0aG9kIHVzZXMgdGhlIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBvcHRpb24gYW5kIGR5bmFtaWMKKyAgcGFydGl0aW9uaW5nOgorCisgIC8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisgICNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyAgI2RlZmluZSBNVERJRFNfREVGQVVMVCAgICAgICAgICJub3IxPXp1bWEtMSxub3IyPXp1bWEtMiIKKyAgI2RlZmluZSBNVERQQVJUU19ERUZBVUxUICAgICAgICJtdGRwYXJ0cz16dW1hLTE6LShqZmZzMiksenVtYS0yOi0odXNlcikiCisKKyAgQ29tbWFuZCBsaW5lIG9mIGNvdXJzZSBwcm9kdWNlcyBiaWdnZXIgaW1hZ2VzLCBhbmQgbWF5IGJlIGluYXBwcm9wcmlhdGUKKyAgZm9yIHNvbWUgdGFyZ2V0cywgc28gYnkgZGVmYXVsdCBpdCdzIG9mZi4KKwogKiBGaXggYnVpbGQgcHJvYmxlbXMgZm9yIFBNODU2IEJvYXJkCiAKICogRml4IHNpZ24gZXh0ZW5zaW9uIGJ1ZyBpbiAnZnBnYSBsb2FkYicgY29tbWFuZDsKZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvY29uZmlnLm1rIGIvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9jb25maWcubWsKaW5kZXggMWJkZjVlNC4uNTg1NmFlYyAxMDA2NDQKLS0tIGEvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9jb25maWcubWsKKysrIGIvYm9hcmQvZGF2ZS9QUENoYW1lbGVvbkVWQi9jb25maWcubWsKQEAgLTIxLDQgKzIxLDggQEAKICMgTUEgMDIxMTEtMTMwNyBVU0EKICMKIAorIyBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uaXRvcgogVEVYVF9CQVNFID0gMHhGRkZDMDAwMAorCisjIFJlc2VydmUgMzIwIGtCIGZvciBNb25pdG9yCisjVEVYVF9CQVNFID0gMHhGRkZCMDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvZWx0ZWMvYmFiN3h4L2FzbV9pbml0LlMgYi9ib2FyZC9lbHRlYy9iYWI3eHgvYXNtX2luaXQuUwppbmRleCAzZjg4YmMyLi4yYTliMzNlIDEwMDY0NAotLS0gYS9ib2FyZC9lbHRlYy9iYWI3eHgvYXNtX2luaXQuUworKysgYi9ib2FyZC9lbHRlYy9iYWI3eHgvYXNtX2luaXQuUwpAQCAtMjQsNiArMjQsNyBAQAogICovCiAKICNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8NzR4eF83eHguaD4KICNpbmNsdWRlIDxtcGMxMDYuaD4KICNpbmNsdWRlIDx2ZXJzaW9uLmg+CmRpZmYgLS1naXQgYS9ib2FyZC9lbHRlYy9iYWI3eHgvbDJjYWNoZS5jIGIvYm9hcmQvZWx0ZWMvYmFiN3h4L2wyY2FjaGUuYwppbmRleCAwNzdmMmM5Li4xZTc1Mzc3IDEwMDY0NAotLS0gYS9ib2FyZC9lbHRlYy9iYWI3eHgvbDJjYWNoZS5jCisrKyBiL2JvYXJkL2VsdGVjL2JhYjd4eC9sMmNhY2hlLmMKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2luY2x1ZGUgPHBjaS5oPgogI2luY2x1ZGUgPG1wYzEwNi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAogLyogZGVmaW5lcyBMMkNSIHJlZ2lzdGVyIGZvciBNUEM3NTAgKi8KIApkaWZmIC0tZ2l0IGEvYm9hcmQvZWx0ZWMvZWxwcGMvYXNtX2luaXQuUyBiL2JvYXJkL2VsdGVjL2VscHBjL2FzbV9pbml0LlMKaW5kZXggYTU2MDViNy4uMWI4ZDM5OSAxMDA2NDQKLS0tIGEvYm9hcmQvZWx0ZWMvZWxwcGMvYXNtX2luaXQuUworKysgYi9ib2FyZC9lbHRlYy9lbHBwYy9hc21faW5pdC5TCkBAIC0yNCw2ICsyNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDx2ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bXBjMTA2Lmg+CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2ZhZHMvZmFkcy5oIGIvYm9hcmQvZmFkcy9mYWRzLmgKaW5kZXggOWFlZDIyNi4uYWZmMWI3ZSAxMDA2NDQKLS0tIGEvYm9hcmQvZmFkcy9mYWRzLmgKKysrIGIvYm9hcmQvZmFkcy9mYWRzLmgKQEAgLTE5Nyw5ICsxOTcsMjUgQEAKICNkZWZpbmUJQ0ZHX0RJUkVDVF9GTEFTSF9URlRQCiAKICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMAotI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTCUNGR19NQVhfRkxBU0hfQkFOS1MKLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUiAgNAorCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qIE5vdGU6IGZha2UgbXRkX2lkIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZSAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWZhZHMwLG5vcjE9ZmFkcy0xLG5vcjI9ZmFkcy0yLG5vcjM9ZmFkcy0zIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1mYWRzLTA6LUAxbSh1c2VyMSksZmFkcy0xOi0odXNlcjIpLGZhZHMtMjotKHVzZXIzKSxmYWRzLTM6LSh1c2VyNCkiCisqLworCiAjZGVmaW5lIENGR19KRkZTMl9TT1JUX0ZSQUdNRU5UUwogI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KIApkaWZmIC0tZ2l0IGEvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvZmxhc2guYyBiL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L2ZsYXNoLmMKaW5kZXggNDA3MzQ1My4uN2RkMGQzZiAxMDA2NDQKLS0tIGEvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvZmxhc2guYworKysgYi9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy9mbGFzaC5jCkBAIC00NDcsNjAgKzQ0NywzIEBACiAJKmFkZHIgPSBGTEFTSF9DTURfUkVTRVQ7CiAJcmV0dXJuICgwKTsKIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogU3VwcG9ydCBmb3IgZmxhc2ggZmlsZSBzeXN0ZW0gKEpGRlMyKQotICoKLSAqIFdlIHVzZSBjdXN0b20gcGFydGl0aW9uIGluZm8gZnVuY3Rpb24gYmVjYXVzZSB3ZSBoYXZlIHRvIGZpdCB0aGUKLSAqIGZpbGUgc3lzdGVtIGltYWdlIGJldHdlZW4gZmlyc3Qgc2VjdG9yIChjb250YWluaW5nIGhhcmQgcmVzZXQKLSAqIGNvbmZpZ3VyYXRpb24gd29yZCkgYW5kIHRoZSBzZWN0b3IgY29udGFpbmluZyBVLUJvb3QgaW1hZ2UuIFN0YW5kYXJkCi0gKiBwYXJ0aXRpb24gaW5mbyBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvdyBmb3IgbGFzdCBzZWN0b3Igc3BlY2lmaWNhdGlvbgotICogYW5kIGFzc3VtZXMgdGhhdCB0aGUgZmlsZSBzeXN0ZW0gb2NjdXBpZXMgZmxhc2ggYmFuayB1cCB0byBhbmQKLSAqIGluY2x1ZGluZyBiYW5rJ3MgbGFzdCBzZWN0b3IuCi0gKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDRkdfSkZGU19DVVNUT01fUEFSVCkKLSNlcnJvciBUT0RPCi0KLSNpZm5kZWYgQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUgotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfU0VDVE9SIDAKLSNlbmRpZgotI2lmbmRlZiBDRkdfSkZGUzJfRklSU1RfQkFOSwotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSyAwCi0jZW5kaWYKLSNpZm5kZWYgQ0ZHX0pGRlMyX05VTV9CQU5LUwotI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTIDEKLSNlbmRpZgotI2RlZmluZSBDRkdfSkZGUzJfTEFTVF9CQU5LIChDRkdfSkZGUzJfRklSU1RfQkFOSyArIENGR19KRkZTMl9OVU1fQkFOS1MgLSAxKQotCi0jaW5jbHVkZSA8amZmczIvamZmczIuaD4KLQotc3RhdGljIHN0cnVjdCBwYXJ0X2luZm8gcGFydGl0aW9uOwotCi1zdHJ1Y3QgcGFydF9pbmZvICpqZmZzMl9wYXJ0X2luZm8oaW50IHBhcnRfbnVtKQotewotCWludCBpOwotCi0JaWYgKHBhcnRfbnVtID09IDApIHsKLQkJaWYgKHBhcnRpdGlvbi51c3JfcHJpdiA9PSAwKSB7Ci0JCQlwYXJ0aXRpb24ub2Zmc2V0ID0KLQkJCQkodW5zaWduZWQgY2hhciAqKSBmbGFzaF9pbmZvW0NGR19KRkZTMl9GSVJTVF9CQU5LXS5zdGFydFtDRkdfSkZGUzJfRklSU1RfU0VDVE9SXTsKLQkJCWZvciAoaSA9IENGR19KRkZTMl9GSVJTVF9CQU5LOyBpIDw9IENGR19KRkZTMl9MQVNUX0JBTks7IGkrKykKLQkJCQlwYXJ0aXRpb24uc2l6ZSArPSBmbGFzaF9pbmZvW2ldLnNpemU7Ci0JCQlwYXJ0aXRpb24uc2l6ZSAtPQotCQkJCWZsYXNoX2luZm9bQ0ZHX0pGRlMyX0ZJUlNUX0JBTktdLnN0YXJ0W0NGR19KRkZTMl9GSVJTVF9TRUNUT1JdIC0KLQkJCQlmbGFzaF9pbmZvW0NGR19KRkZTMl9GSVJTVF9CQU5LXS5zdGFydFswXTsKLSNpZmRlZiBDRkdfSkZGUzJfTEFTVF9TRUNUT1IKLQkJCWkgPSBmbGFzaF9pbmZvW0NGR19KRkZTMl9MQVNUX0JBTktdLnNlY3Rvcl9jb3VudCAtIDE7Ci0JCQlwYXJ0aXRpb24uc2l6ZSAtPQotCQkJCWZsYXNoX2luZm9bQ0ZHX0pGRlMyX0xBU1RfQkFOS10uc3RhcnRbaV0gLQotCQkJCWZsYXNoX2luZm9bQ0ZHX0pGRlMyX0xBU1RfQkFOS10uc3RhcnRbQ0ZHX0pGRlMyX0xBU1RfU0VDVE9SXTsKLSNlbmRpZgotCi0JCQlwYXJ0aXRpb24udXNyX3ByaXYgPSAodm9pZCAqKTE7Ci0JCX0KLQkJcmV0dXJuICZwYXJ0aXRpb247Ci0JfQotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogSkZGUzIgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2lubm9rb20vZmxhc2guYyBiL2JvYXJkL2lubm9rb20vZmxhc2guYwppbmRleCAyOWM5MTY2Li4yOThhY2M4IDEwMDY0NAotLS0gYS9ib2FyZC9pbm5va29tL2ZsYXNoLmMKKysrIGIvYm9hcmQvaW5ub2tvbS9mbGFzaC5jCkBAIC0zNSwxMCArMzUsNiBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CiAKLSNpZiBkZWZpbmVkIENGR19KRkZTX0NVU1RPTV9QQVJUCi0jaW5jbHVkZSA8amZmczIvamZmczIuaD4KLSNlbmRpZgotCiAvKiBEZWJ1Z2dpbmcgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgKi8KIAogI3VuZGVmIEZMQVNIX0RFQlVHCkBAIC03OCwxNzkgKzc0LDYgQEAKIAogZmxhc2hfaW5mb190ICAgIGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CiAKLQotI2lmIGRlZmluZWQgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQKLQotLyoqCi0gKiBqZmZzMl9wYXJ0X2luZm8gLSBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBKRkZTMiBwYXJ0aXRpb24KLSAqCi0gKiBAcGFydF9udW06IG51bWJlciBvZiB0aGUgcGFydGl0aW9uIHlvdSB3YW50IHRvIGdldCBpbmZvIGFib3V0Ci0gKiBAcmV0dXJuOiAgIHN0cnVjdCBwYXJ0X2luZm8qIGluIGNhc2Ugb2Ygc3VjY2VzcywgMCBpZiBmYWlsdXJlCi0gKi8KLQotc3RhdGljIHN0cnVjdCBwYXJ0X2luZm8gcGFydDsKLXN0YXRpYyBpbnQgY3VycmVudF9wYXJ0ID0gLTE7Ci0KLSNpZmRlZiBDT05GSUdfTVREX0lOTk9LT01fMTZNQgotI2lmZGVmIENPTkZJR19NVERfSU5OT0tPTV82NE1CCi0jZXJyb3IgUGxlYXNlIGRlZmluZSBvbmx5IG9uZSBDT05GSUdfTVREX0lOTk9LT01fWFhNQiBvcHRpb24uCi0jZW5kaWYKLXN0cnVjdCBwYXJ0X2luZm8qIGpmZnMyX3BhcnRfaW5mbyhpbnQgcGFydF9udW0pIHsKLQl2b2lkICpqZmZzMl9wcml2X3NhdmVkID0gcGFydC5qZmZzMl9wcml2OwotCi0JUFJJTlRLMigiamZmczJfcGFydF9pbmZvOiBwYXJ0X251bT0laVxuIixwYXJ0X251bSk7Ci0KLQlpZiAoY3VycmVudF9wYXJ0ID09IHBhcnRfbnVtKQotCQlyZXR1cm4gJnBhcnQ7Ci0KLQkvKiB1LWJvb3QgcGFydGl0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JaWYocGFydF9udW09PTApewotCQltZW1zZXQoJnBhcnQsIDAsIHNpemVvZihwYXJ0KSk7Ci0KLQkJcGFydC5vZmZzZXQ9KGNoYXIqKTB4MDAwMDAwMDA7Ci0JCXBhcnQuc2l6ZT0yNTYqMTAyNDsKLQotCQkvKiBNYXJrIHRoZSBzdHJ1Y3QgYXMgcmVhZHkgKi8KLQkJY3VycmVudF9wYXJ0ID0gcGFydF9udW07Ci0KLQkJUFJJTlRLKCJwYXJ0Lm9mZnNldCA9IDB4JTA4eFxuIiwodW5zaWduZWQgaW50KXBhcnQub2Zmc2V0KTsKLQkJUFJJTlRLKCJwYXJ0LnNpemUgICA9IDB4JTA4eFxuIiwodW5zaWduZWQgaW50KXBhcnQuc2l6ZSk7Ci0JfQotCi0JLyogcHJpbWFyeSBPUytmaXJtd2FyZSBwYXJ0aXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCWlmKHBhcnRfbnVtPT0xKXsKLQkJbWVtc2V0KCZwYXJ0LCAwLCBzaXplb2YocGFydCkpOwotCi0JCXBhcnQub2Zmc2V0PShjaGFyKikweDAwMDQwMDAwOwotCQlwYXJ0LnNpemU9NzY4KjEwMjQ7Ci0KLQkJLyogTWFyayB0aGUgc3RydWN0IGFzIHJlYWR5ICovCi0JCWN1cnJlbnRfcGFydCA9IHBhcnRfbnVtOwotCi0JCVBSSU5USygicGFydC5vZmZzZXQgPSAweCUwOHhcbiIsKHVuc2lnbmVkIGludClwYXJ0Lm9mZnNldCk7Ci0JCVBSSU5USygicGFydC5zaXplICAgPSAweCUwOHhcbiIsKHVuc2lnbmVkIGludClwYXJ0LnNpemUpOwotCX0KLQotCS8qIHNlY29uZGFyeSBPUytmaXJtd2FyZSBwYXJ0aXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlpZihwYXJ0X251bT09Mil7Ci0JCW1lbXNldCgmcGFydCwgMCwgc2l6ZW9mKHBhcnQpKTsKLQotCQlwYXJ0Lm9mZnNldD0oY2hhciopMHgwMDEwMDAwMDsKLQkJcGFydC5zaXplPTgqMTAyNCoxMDI0OwotCi0JCS8qIE1hcmsgdGhlIHN0cnVjdCBhcyByZWFkeSAqLwotCQljdXJyZW50X3BhcnQgPSBwYXJ0X251bTsKLQotCQlQUklOVEsoInBhcnQub2Zmc2V0ID0gMHglMDh4XG4iLCh1bnNpZ25lZCBpbnQpcGFydC5vZmZzZXQpOwotCQlQUklOVEsoInBhcnQuc2l6ZSAgID0gMHglMDh4XG4iLCh1bnNpZ25lZCBpbnQpcGFydC5zaXplKTsKLQl9Ci0KLQkvKiBkYXRhIHBhcnRpdGlvbiAqLwotCWlmKHBhcnRfbnVtPT0zKXsKLQkJbWVtc2V0KCZwYXJ0LCAwLCBzaXplb2YocGFydCkpOwotCi0JCXBhcnQub2Zmc2V0PShjaGFyKikweDAwOTAwMDAwOwotCQlwYXJ0LnNpemU9NyoxMDI0KjEwMjQ7Ci0KLQkJLyogTWFyayB0aGUgc3RydWN0IGFzIHJlYWR5ICovCi0JCWN1cnJlbnRfcGFydCA9IHBhcnRfbnVtOwotCi0JCVBSSU5USygicGFydC5vZmZzZXQgPSAweCUwOHhcbiIsKHVuc2lnbmVkIGludClwYXJ0Lm9mZnNldCk7Ci0JCVBSSU5USygicGFydC5zaXplICAgPSAweCUwOHhcbiIsKHVuc2lnbmVkIGludClwYXJ0LnNpemUpOwotCX0KLQotCWlmIChjdXJyZW50X3BhcnQgPT0gcGFydF9udW0pIHsKLQkJcGFydC51c3JfcHJpdiA9ICZjdXJyZW50X3BhcnQ7Ci0JCXBhcnQuamZmczJfcHJpdiA9IGpmZnMyX3ByaXZfc2F2ZWQ7Ci0JCXJldHVybiAmcGFydDsKLQl9Ci0KLQlQUklOVEsoImpmZnMyX3BhcnRfaW5mbzogZW5kIG9mIHBhcnRpdGlvbiB0YWJsZVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX01URF9JTk5PS09NXzE2TUIgKi8KLQotI2lmZGVmIENPTkZJR19NVERfSU5OT0tPTV82NE1CCi0jaWZkZWYgQ09ORklHX01URF9JTk5PS09NXzE2TUIKLSNlcnJvciBQbGVhc2UgZGVmaW5lIG9ubHkgb25lIENPTkZJR19NVERfSU5OT0tPTV9YWE1CIG9wdGlvbi4KLSNlbmRpZgotc3RydWN0IHBhcnRfaW5mbyogamZmczJfcGFydF9pbmZvKGludCBwYXJ0X251bSkgewotCXZvaWQgKmpmZnMyX3ByaXZfc2F2ZWQgPSBwYXJ0LmpmZnMyX3ByaXY7Ci0KLQlQUklOVEsyKCJqZmZzMl9wYXJ0X2luZm86IHBhcnRfbnVtPSVpXG4iLHBhcnRfbnVtKTsKLQotCWlmIChjdXJyZW50X3BhcnQgPT0gcGFydF9udW0pCi0JCXJldHVybiAmcGFydDsKLQotCS8qIHUtYm9vdCBwYXJ0aXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlpZihwYXJ0X251bT09MCl7Ci0JCW1lbXNldCgmcGFydCwgMCwgc2l6ZW9mKHBhcnQpKTsKLQotCQlwYXJ0Lm9mZnNldD0oY2hhciopMHgwMDAwMDAwMDsKLQkJcGFydC5zaXplPTI1NioxMDI0OwotCi0JCS8qIE1hcmsgdGhlIHN0cnVjdCBhcyByZWFkeSAqLwotCQljdXJyZW50X3BhcnQgPSBwYXJ0X251bTsKLQotCQlQUklOVEsoInBhcnQub2Zmc2V0ID0gMHglMDh4XG4iLCh1bnNpZ25lZCBpbnQpcGFydC5vZmZzZXQpOwotCQlQUklOVEsoInBhcnQuc2l6ZSAgID0gMHglMDh4XG4iLCh1bnNpZ25lZCBpbnQpcGFydC5zaXplKTsKLQl9Ci0KLQkvKiBwcmltYXJ5IE9TK2Zpcm13YXJlIHBhcnRpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JaWYocGFydF9udW09PTEpewotCQltZW1zZXQoJnBhcnQsIDAsIHNpemVvZihwYXJ0KSk7Ci0KLQkJcGFydC5vZmZzZXQ9KGNoYXIqKTB4MDAwNDAwMDA7Ci0JCXBhcnQuc2l6ZT0xNioxMDI0KjEwMjQtMTI4KjEwMjQ7Ci0KLQkJLyogTWFyayB0aGUgc3RydWN0IGFzIHJlYWR5ICovCi0JCWN1cnJlbnRfcGFydCA9IHBhcnRfbnVtOwotCi0JCVBSSU5USygicGFydC5vZmZzZXQgPSAweCUwOHhcbiIsKHVuc2lnbmVkIGludClwYXJ0Lm9mZnNldCk7Ci0JCVBSSU5USygicGFydC5zaXplICAgPSAweCUwOHhcbiIsKHVuc2lnbmVkIGludClwYXJ0LnNpemUpOwotCX0KLQotCS8qIHNlY29uZGFyeSBPUytmaXJtd2FyZSBwYXJ0aXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlpZihwYXJ0X251bT09Mil7Ci0JCW1lbXNldCgmcGFydCwgMCwgc2l6ZW9mKHBhcnQpKTsKLQotCQlwYXJ0Lm9mZnNldD0oY2hhciopMHgwMTAyMDAwMDsKLQkJcGFydC5zaXplPTE2KjEwMjQqMTAyNC0xMjgqMTAyNDsKLQotCQkvKiBNYXJrIHRoZSBzdHJ1Y3QgYXMgcmVhZHkgKi8KLQkJY3VycmVudF9wYXJ0ID0gcGFydF9udW07Ci0KLQkJUFJJTlRLKCJwYXJ0Lm9mZnNldCA9IDB4JTA4eFxuIiwodW5zaWduZWQgaW50KXBhcnQub2Zmc2V0KTsKLQkJUFJJTlRLKCJwYXJ0LnNpemUgICA9IDB4JTA4eFxuIiwodW5zaWduZWQgaW50KXBhcnQuc2l6ZSk7Ci0JfQotCi0JLyogZGF0YSBwYXJ0aXRpb24gKi8KLQlpZihwYXJ0X251bT09Myl7Ci0JCW1lbXNldCgmcGFydCwgMCwgc2l6ZW9mKHBhcnQpKTsKLQotCQlwYXJ0Lm9mZnNldD0oY2hhciopMHgwMjAwMDAwMDsKLQkJcGFydC5zaXplPTMyKjEwMjQqMTAyNDsKLQotCQkvKiBNYXJrIHRoZSBzdHJ1Y3QgYXMgcmVhZHkgKi8KLQkJY3VycmVudF9wYXJ0ID0gcGFydF9udW07Ci0KLQkJUFJJTlRLKCJwYXJ0Lm9mZnNldCA9IDB4JTA4eFxuIiwodW5zaWduZWQgaW50KXBhcnQub2Zmc2V0KTsKLQkJUFJJTlRLKCJwYXJ0LnNpemUgICA9IDB4JTA4eFxuIiwodW5zaWduZWQgaW50KXBhcnQuc2l6ZSk7Ci0JfQotCi0JaWYgKGN1cnJlbnRfcGFydCA9PSBwYXJ0X251bSkgewotCQlwYXJ0LnVzcl9wcml2ID0gJmN1cnJlbnRfcGFydDsKLQkJcGFydC5qZmZzMl9wcml2ID0gamZmczJfcHJpdl9zYXZlZDsKLQkJcmV0dXJuICZwYXJ0OwotCX0KLQotCVBSSU5USygiamZmczJfcGFydF9pbmZvOiBlbmQgb2YgcGFydGl0aW9uIHRhYmxlXG4iKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfTVREX0lOTk9LT01fNjRNQiAqLwotI2VuZGlmIC8qIGRlZmluZWQgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQgKi8KLQotCiAvKioKICAqIGZsYXNoX2luaXQ6IC0gaW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGZsYXNoIGNoaXBzCiAgKgpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODI2MGFkcy9mbGFzaC5jIGIvYm9hcmQvbXBjODI2MGFkcy9mbGFzaC5jCmluZGV4IGIyZTlkZjIuLjU5OTk3YWEgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzgyNjBhZHMvZmxhc2guYworKysgYi9ib2FyZC9tcGM4MjYwYWRzL2ZsYXNoLmMKQEAgLTQ5MCw1OSArNDkwLDMgQEAKIAogCXJldHVybiByYzsKIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogU3VwcG9ydCBmb3IgZmxhc2ggZmlsZSBzeXN0ZW0gKEpGRlMyKQotICoKLSAqIFdlIHVzZSBjdXN0b20gcGFydGl0aW9uIGluZm8gZnVuY3Rpb24gYmVjYXVzZSB3ZSBoYXZlIHRvIGZpdCB0aGUKLSAqIGZpbGUgc3lzdGVtIGltYWdlIGJldHdlZW4gZmlyc3Qgc2VjdG9yIChjb250YWluaW5nIGhhcmQgcmVzZXQKLSAqIGNvbmZpZ3VyYXRpb24gd29yZCkgYW5kIHRoZSBzZWN0b3IgY29udGFpbmluZyBVLUJvb3QgaW1hZ2UuIFN0YW5kYXJkCi0gKiBwYXJ0aXRpb24gaW5mbyBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvdyBmb3IgbGFzdCBzZWN0b3Igc3BlY2lmaWNhdGlvbgotICogYW5kIGFzc3VtZXMgdGhhdCB0aGUgZmlsZSBzeXN0ZW0gb2NjdXBpZXMgZmxhc2ggYmFuayB1cCB0byBhbmQKLSAqIGluY2x1ZGluZyBiYW5rJ3MgbGFzdCBzZWN0b3IuCi0gKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDRkdfSkZGU19DVVNUT01fUEFSVCkKLQotI2lmbmRlZiBDRkdfSkZGUzJfRklSU1RfU0VDVE9SCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9TRUNUT1IgMAotI2VuZGlmCi0jaWZuZGVmIENGR19KRkZTMl9GSVJTVF9CQU5LCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LIDAKLSNlbmRpZgotI2lmbmRlZiBDRkdfSkZGUzJfTlVNX0JBTktTCi0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MgMQotI2VuZGlmCi0jZGVmaW5lIENGR19KRkZTMl9MQVNUX0JBTksgKENGR19KRkZTMl9GSVJTVF9CQU5LICsgQ0ZHX0pGRlMyX05VTV9CQU5LUyAtIDEpCi0KLSNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgotCi1zdGF0aWMgc3RydWN0IHBhcnRfaW5mbyBwYXJ0aXRpb247Ci0KLXN0cnVjdCBwYXJ0X2luZm8gKmpmZnMyX3BhcnRfaW5mbyhpbnQgcGFydF9udW0pCi17Ci0JaW50IGk7Ci0KLQlpZiAocGFydF9udW0gPT0gMCkgewotCQlpZiAocGFydGl0aW9uLnVzcl9wcml2ID09IDApIHsKLQkJCXBhcnRpdGlvbi5vZmZzZXQgPQotCQkJCSh1bnNpZ25lZCBjaGFyICopIGZsYXNoX2luZm9bQ0ZHX0pGRlMyX0ZJUlNUX0JBTktdLnN0YXJ0W0NGR19KRkZTMl9GSVJTVF9TRUNUT1JdOwotCQkJZm9yIChpID0gQ0ZHX0pGRlMyX0ZJUlNUX0JBTks7IGkgPD0gQ0ZHX0pGRlMyX0xBU1RfQkFOSzsgaSsrKQotCQkJCXBhcnRpdGlvbi5zaXplICs9IGZsYXNoX2luZm9baV0uc2l6ZTsKLQkJCXBhcnRpdGlvbi5zaXplIC09Ci0JCQkJZmxhc2hfaW5mb1tDRkdfSkZGUzJfRklSU1RfQkFOS10uc3RhcnRbQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUl0gLQotCQkJCWZsYXNoX2luZm9bQ0ZHX0pGRlMyX0ZJUlNUX0JBTktdLnN0YXJ0WzBdOwotI2lmZGVmIENGR19KRkZTMl9MQVNUX1NFQ1RPUgotCQkJaSA9IGZsYXNoX2luZm9bQ0ZHX0pGRlMyX0xBU1RfQkFOS10uc2VjdG9yX2NvdW50IC0gMTsKLQkJCXBhcnRpdGlvbi5zaXplIC09Ci0JCQkJZmxhc2hfaW5mb1tDRkdfSkZGUzJfTEFTVF9CQU5LXS5zdGFydFtpXSAtCi0JCQkJZmxhc2hfaW5mb1tDRkdfSkZGUzJfTEFTVF9CQU5LXS5zdGFydFtDRkdfSkZGUzJfTEFTVF9TRUNUT1JdOwotI2VuZGlmCi0KLQkJCXBhcnRpdGlvbi51c3JfcHJpdiA9ICh2b2lkICopMTsKLQkJfQotCQlyZXR1cm4gJnBhcnRpdGlvbjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBKRkZTMiAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXgxZnMyL2ZsYXNoLmMgYi9ib2FyZC9teDFmczIvZmxhc2guYwppbmRleCAzYTc5YTllLi4zODA2MzEwIDEwMDY0NAotLS0gYS9ib2FyZC9teDFmczIvZmxhc2guYworKysgYi9ib2FyZC9teDFmczIvZmxhc2guYwpAQCAtMjUsMTAgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgZGVmaW5lZCBDRkdfSkZGU19DVVNUT01fUEFSVAotI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+Ci0jZW5kaWYKLQogI2RlZmluZSBGTEFTSF9CQU5LX1NJWkUgTVgxRlMyX0ZMQVNIX0JBTktfU0laRQogI2RlZmluZSBNQUlOX1NFQ1RfU0laRSAgTVgxRlMyX0ZMQVNIX1NFQ1RfU0laRQogCkBAIC03MCw2NyArNjYsNiBAQAogc3RhdGljIHZvaWQgZmxhc2hfc3luY19yZWFsX3Byb3RlY3QoZmxhc2hfaW5mb190ICogaW5mbyk7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQKLQotLyoqCi0gKiBqZmZzMl9wYXJ0X2luZm8gLSBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBKRkZTMiBwYXJ0aXRpb24KLSAqCi0gKiBAcGFydF9udW06IG51bWJlciBvZiB0aGUgcGFydGl0aW9uIHlvdSB3YW50IHRvIGdldCBpbmZvIGFib3V0Ci0gKiBAcmV0dXJuOiAgIHN0cnVjdCBwYXJ0X2luZm8qIGluIGNhc2Ugb2Ygc3VjY2VzcywgMCBpZiBmYWlsdXJlCi0gKi8KLQotc3RhdGljIHN0cnVjdCBwYXJ0X2luZm8gcGFydDsKLXN0YXRpYyBpbnQgY3VycmVudF9wYXJ0ID0gLTE7Ci0KLXN0cnVjdCBwYXJ0X2luZm8gKgotamZmczJfcGFydF9pbmZvKGludCBwYXJ0X251bSkKLXsKLQl2b2lkICpqZmZzMl9wcml2X3NhdmVkID0gcGFydC5qZmZzMl9wcml2OwotCi0JcHJpbnRmKCJqZmZzMl9wYXJ0X2luZm86IHBhcnRfbnVtPSVpXG4iLCBwYXJ0X251bSk7Ci0KLQlpZiAoY3VycmVudF9wYXJ0ID09IHBhcnRfbnVtKQotCQlyZXR1cm4gJnBhcnQ7Ci0KLQkvKiByb290ZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlpZiAocGFydF9udW0gPT0gMCkgewotCQltZW1zZXQoJnBhcnQsIDAsIHNpemVvZiAocGFydCkpOwotCi0JCXBhcnQub2Zmc2V0ID0gKGNoYXIgKikgTVgxRlMyX0pGRlMyX1BBUlQwX1NUQVJUOwotCQlwYXJ0LnNpemUgPSBNWDFGUzJfSkZGUzJfUEFSVDBfU0laRTsKLQotCQkvKiBNYXJrIHRoZSBzdHJ1Y3QgYXMgcmVhZHkgKi8KLQkJY3VycmVudF9wYXJ0ID0gcGFydF9udW07Ci0KLQkJcHJpbnRmKCJwYXJ0Lm9mZnNldCA9IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCkgcGFydC5vZmZzZXQpOwotCQlwcmludGYoInBhcnQuc2l6ZSAgID0gMHglMDh4XG4iLCAodW5zaWduZWQgaW50KSBwYXJ0LnNpemUpOwotCX0KLQotCS8qIHVzZXJmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JaWYgKHBhcnRfbnVtID09IDEpIHsKLQkJbWVtc2V0KCZwYXJ0LCAwLCBzaXplb2YgKHBhcnQpKTsKLQotCQlwYXJ0Lm9mZnNldCA9IChjaGFyICopIE1YMUZTMl9KRkZTMl9QQVJUMV9TVEFSVDsKLQkJcGFydC5zaXplID0gTVgxRlMyX0pGRlMyX1BBUlQxX1NJWkU7Ci0KLQkJLyogTWFyayB0aGUgc3RydWN0IGFzIHJlYWR5ICovCi0JCWN1cnJlbnRfcGFydCA9IHBhcnRfbnVtOwotCi0JCXByaW50ZigicGFydC5vZmZzZXQgPSAweCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpIHBhcnQub2Zmc2V0KTsKLQkJcHJpbnRmKCJwYXJ0LnNpemUgICA9IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCkgcGFydC5zaXplKTsKLQl9Ci0KLQlpZiAoY3VycmVudF9wYXJ0ID09IHBhcnRfbnVtKSB7Ci0JCXBhcnQudXNyX3ByaXYgPSAmY3VycmVudF9wYXJ0OwotCQlwYXJ0LmpmZnMyX3ByaXYgPSBqZmZzMl9wcml2X3NhdmVkOwotCQlyZXR1cm4gJnBhcnQ7Ci0JfQotCi0JcHJpbnRmKCJqZmZzMl9wYXJ0X2luZm86IGVuZCBvZiBwYXJ0aXRpb24gdGFibGVcbiIpOwotCXJldHVybiAwOwotfQotI2VuZGlmCQkJCS8qIENGR19KRkZTX0NVU1RPTV9QQVJUICovCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIGZsYXNoX2luaXQoKQogICoKZGlmZiAtLWdpdCBhL2JvYXJkL3NpeG5ldC9zaXhuZXQuYyBiL2JvYXJkL3NpeG5ldC9zaXhuZXQuYwppbmRleCA0MmQxNDk3Li5jMzFlYTUzIDEwMDY0NAotLS0gYS9ib2FyZC9zaXhuZXQvc2l4bmV0LmMKKysrIGIvYm9hcmQvc2l4bmV0L3NpeG5ldC5jCkBAIC02MDEsNzAgKzYwMSwzIEBACiAKIAlyZXR1cm4gKHNpemVfc2RyYW0pOwogfQotCi0jaWZkZWYgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQKLQotc3RhdGljIHN0cnVjdCBwYXJ0X2luZm8gcGFydDsKLQotI2RlZmluZSBqZmZzMl9ibG9jayhpKQlcCi0JKChzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKikoQ0ZHX0pGRlMyX0JBU0UgKyAoaSkgKiA2NTUzNikpCi0KLXN0cnVjdCBwYXJ0X2luZm8qIGpmZnMyX3BhcnRfaW5mbyhpbnQgcGFydF9udW0pCi17Ci0JREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7Ci0JYmRfdCAqYmQgPSBnZC0+YmQ7Ci0JY2hhciogczsKLQlpbnQgaTsKLQlpbnQgYm9vdG5vciA9IDA7CS8qIGFzc3VtZSBib290aW5nIGZyb20gTkFORCBmbGFzaCAqLwotCi0JaWYgKHBhcnRfbnVtICE9IDApCi0JCXJldHVybiAwOwkvKiBvbmx5IHN1cHBvcnQgb25lIHBhcnRpdGlvbiAqLwotCi0JaWYgKHBhcnQudXNyX3ByaXYgPT0gKHZvaWQqKTEpCi0JCXJldHVybiAmcGFydDsJLyogYWxyZWFkeSBoYXZlIHBhcnQgaW5mbyAqLwotCi0JbWVtc2V0KCZwYXJ0LCAwLCBzaXplb2YocGFydCkpOwotCi0JaWYgKG5hbmRfZGV2X2Rlc2NbMF0uQ2hpcElEID09IE5BTkRfQ2hpcElEX1VOS05PV04pCi0JCWJvb3Rub3IgPSAxOwotCWVsc2UgaWYgKGJkLT5iaV9mbGFzaHNpemUgPCAweDgwMDAwMCkKLQkJYm9vdG5vciA9IDA7Ci0JZWxzZSBmb3IgKGkgPSAwOyAhYm9vdG5vciAmJiBpIDwgNDsgKytpKSB7Ci0JCS8qIGJvb3QgZnJvbSBOT1IgaWYgSkZGUzIgaW5mbyBpbiBhbnkgb2YKLQkJICogZmlyc3QgNCBlcmFzZSBibG9ja3MKLQkJICovCi0KLQkJaWYgKGpmZnMyX2Jsb2NrKGkpLT5tYWdpYyA9PSBKRkZTMl9NQUdJQ19CSVRNQVNLKQotCQkJYm9vdG5vciA9IDE7Ci0JfQotCi0JaWYgKGJvb3Rub3IpIHsKLQkJLyogbm8gTkFORCBmbGFzaCBvciBib290IGluIE5PUiwgdXNlIE5PUiBmbGFzaCAqLwotCQlwYXJ0Lm9mZnNldCA9ICh1bnNpZ25lZCBjaGFyICopQ0ZHX0pGRlMyX0JBU0U7Ci0JCXBhcnQuc2l6ZSA9IENGR19KRkZTMl9TSVpFOwotCX0KLQllbHNlIHsKLQkJY2hhciByZWFkY21kWzYwXTsKLQotCQkvKiBib290IGluZm8gaW4gTkFORCBmbGFzaCwgZ2V0IGFuZCB1c2UgY29weSBpbiBSQU0gKi8KLQotCQkvKiBvdmVycmlkZSBpbmZvIGZyb20gZW52aXJvbm1lbnQgaWYgcHJlc2VudCAqLwotCQlzID0gZ2V0ZW52KCJmc2FkZHIiKTsKLQkJcGFydC5vZmZzZXQgPSBzID8gKHZvaWQgKilzaW1wbGVfc3RydG91bChzLCBOVUxMLCAxNikKLQkJCQk6ICh2b2lkICopQ0ZHX0pGRlMyX1JBTUJBU0U7Ci0JCXMgPSBnZXRlbnYoImZzc2l6ZSIpOwotCQlwYXJ0LnNpemUgPSBzID8gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMTYpCi0JCQkgICAgICA6IENGR19KRkZTMl9SQU1TSVpFOwotCi0JCS8qIHJlYWQgZnJvbSBuYW5kIGZsYXNoICovCi0JCXNwcmludGYocmVhZGNtZCwgIm5hbmQgcmVhZC5qZmZzMiAleCAwICV4IiwKLQkJCSh1aW50MzJfdClwYXJ0Lm9mZnNldCwgcGFydC5zaXplKTsKLQkJcnVuX2NvbW1hbmQocmVhZGNtZCwgMCk7Ci0JfQotCi0JcGFydC5lcmFzZXNpemUgPSAwOwkvKiB1bnVzZWQgKi8KLQlwYXJ0LnVzcl9wcml2PSh2b2lkKikxOwkvKiByZWFkeSAqLwotCi0JcmV0dXJuICZwYXJ0OwotfQotI2VuZGlmIC8qIGlmZGVmIENGR19KRkZTX0NVU1RPTV9QQVJUICovCmRpZmYgLS1naXQgYS9ib2FyZC92b2ljZWJsdWUvdm9pY2VibHVlLmMgYi9ib2FyZC92b2ljZWJsdWUvdm9pY2VibHVlLmMKaW5kZXggOTY5MTEwNi4uN2EyZDI0MyAxMDA2NDQKLS0tIGEvYm9hcmQvdm9pY2VibHVlL3ZvaWNlYmx1ZS5jCisrKyBiL2JvYXJkL3ZvaWNlYmx1ZS92b2ljZWJsdWUuYwpAQCAtNTYsOTAgKzU2LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZm5kZWYgVk9JQ0VCTFVFX1NNQUxMX0ZMQVNICi0KLSNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgotCi1leHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bXTsKLXN0YXRpYyBzdHJ1Y3QgcGFydF9pbmZvIHBhcnRpbmZvOwotc3RhdGljIGludCBjdXJyZW50X3BhcnQgPSAtMTsKLQotLyogUGFydGl0aW9uIHRhYmxlIChMaW51eCBNVEQgc2VlIGl0IHRoaXMgd2F5KQotICoKLSAqIDAgLSBVLUJvb3QKLSAqIDEgLSBlbnYKLSAqIDIgLSByZWR1bmRhbnQgZW52Ci0gKiAzIC0gZGF0YTEgKGpmZnMyKQotICogNCAtIGRhdGEyIChqZmZzMikKLSAqLwotCi1zdGF0aWMgc3RydWN0IHsKLQl1bG9uZyBvZmZzZXQ7Ci0JdWxvbmcgc2l6ZTsKLX0gcGFydFs1XTsKLQotc3RhdGljIHZvaWQgcGFydGl0aW9uX2ZsYXNoKGZsYXNoX2luZm9fdCAqaW5mbykKLXsKLQljaGFyIG10ZHBhcnRzWzEyOF07Ci0JaW50IGksIG4sIHNpemUsIHBzaXplOwotCWNvbnN0IHVsb25nIHBsZW5bM10gPSB7IENGR19NT05JVE9SX0xFTiwgQ0ZHX0VOVl9TSVpFLCBDRkdfRU5WX1NJWkUgfTsKLQotCXNpemUgPSBuID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCXBhcnRbaV0ub2Zmc2V0ID0gaW5mby0+c3RhcnRbbl07Ci0JCXBzaXplID0gaSA8IDMgPyBwbGVuW2ldIDogKGluZm8tPnNpemUgLSBzaXplKSAvIDI7Ci0JCXdoaWxlIChwYXJ0W2ldLnNpemUgPCBwc2l6ZSkgewotCQkJaWYgKCsrbiA+IGluZm8tPnNlY3Rvcl9jb3VudCkgewotCQkJCXByaW50ZigiUGFydGl0aW9uaW5nIGVycm9yLiBTeXN0ZW0gaGFsdGVkLlxuIik7Ci0JCQkJd2hpbGUgKDEpIDsKLQkJCX0KLQkJCXBhcnRbaV0uc2l6ZSArPSBpbmZvLT5zdGFydFtuXSAtIGluZm8tPnN0YXJ0W24gLSAxXTsKLQkJfQotCQlzaXplICs9IHBhcnRbaV0uc2l6ZTsKLQl9Ci0JcGFydFs0XS5vZmZzZXQgPSBpbmZvLT5zdGFydFtuXTsKLQlwYXJ0WzRdLnNpemUgPSBpbmZvLT5zdGFydFtpbmZvLT5zZWN0b3JfY291bnQgLSAxXSAtIGluZm8tPnN0YXJ0W25dOwotCi0Jc3ByaW50ZihtdGRwYXJ0cywgIm9tYXBmbGFzaC4wOiIKLQkJCSIlZGsoVS1Cb290KXJvLCVkayhlbnYpLCVkayhyX2VudiksJWRrKGRhdGExKSwtKGRhdGEyKSIsCi0JCQlwYXJ0WzBdLnNpemUgPj4gMTAsIHBhcnRbMV0uc2l6ZSA+PiAxMCwKLQkJCXBhcnRbMl0uc2l6ZSA+PiAxMCwgcGFydFszXS5zaXplID4+IDEwKTsKLQlzZXRlbnYgKCJtdGRwYXJ0cyIsIG10ZHBhcnRzKTsKLX0KLQotc3RydWN0IHBhcnRfaW5mbyogamZmczJfcGFydF9pbmZvKGludCBwYXJ0X251bSkKLXsKLQl2b2lkICpqZmZzMl9wcml2X3NhdmVkID0gcGFydGluZm8uamZmczJfcHJpdjsKLQotCWlmIChwYXJ0X251bSAhPSAzICYmIHBhcnRfbnVtICE9IDQpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGN1cnJlbnRfcGFydCAhPSBwYXJ0X251bSkgewotCQltZW1zZXQoJnBhcnRpbmZvLCAwLCBzaXplb2YocGFydGluZm8pKTsKLQkJY3VycmVudF9wYXJ0ID0gcGFydF9udW07Ci0JCXBhcnRpbmZvLm9mZnNldCA9IChjaGFyKikgcGFydFtwYXJ0X251bV0ub2Zmc2V0OwotCQlwYXJ0aW5mby5zaXplID0gcGFydFtwYXJ0X251bV0uc2l6ZTsKLQkJcGFydGluZm8udXNyX3ByaXYgPSAmY3VycmVudF9wYXJ0OwotCQlwYXJ0aW5mby5qZmZzMl9wcml2ID0gamZmczJfcHJpdl9zYXZlZDsKLQl9Ci0KLQlyZXR1cm4gJnBhcnRpbmZvOwotfQotCi0jZW5kaWYKLQogaW50IG1pc2NfaW5pdF9yKHZvaWQpCiB7CiAJKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgVk9JQ0VCTFVFX0xFRF9SRUcpID0gMHg1NTsKIAotI2lmbmRlZiBWT0lDRUJMVUVfU01BTExfRkxBU0gKLQlpZiAoZmxhc2hfaW5mb1swXS5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7Ci0JCXByaW50ZigiVW5rbm93biBmbGFzaC4gU3lzdGVtIGhhbHRlZC5cbiIpOwotCQl3aGlsZSAoMSkgOwotCX0KLQlwYXJ0aXRpb25fZmxhc2goJmZsYXNoX2luZm9bMF0pOwotI2VuZGlmCi0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYm9hcmQveHNlbmdpbmUvZmxhc2guYyBiL2JvYXJkL3hzZW5naW5lL2ZsYXNoLmMKaW5kZXggYmZhMjg3Yi4uM2Y5MzcwMCAxMDA2NDQKLS0tIGEvYm9hcmQveHNlbmdpbmUvZmxhc2guYworKysgYi9ib2FyZC94c2VuZ2luZS9mbGFzaC5jCkBAIC0yNywxMCArMjcsNiBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiLmg+CiAKLSNpZiBkZWZpbmVkIENGR19KRkZTX0NVU1RPTV9QQVJUCi0jaW5jbHVkZSA8amZmczIvamZmczIuaD4KLSNlbmRpZgotCiAjZGVmaW5lIFNXQVAoeCkgICAgICAgICAgICAgICBfX3N3YWIzMih4KQogCiBmbGFzaF9pbmZvX3QJZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsgLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMgKi8KQEAgLTQwLDgwICszNiw2IEBACiBzdGF0aWMgaW50IHdyaXRlX3dvcmQgKGZsYXNoX2luZm9fdCAqaW5mbywgdWxvbmcgZGVzdCwgdWxvbmcgZGF0YSk7CiBzdGF0aWMgdm9pZCBmbGFzaF9nZXRfb2Zmc2V0cyAodWxvbmcgYmFzZSwgZmxhc2hfaW5mb190ICppbmZvKTsKIAotI2lmIGRlZmluZWQgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQKLQotLyoKLSAqIGpmZnMyX3BhcnRfaW5mbyAtIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIEpGRlMyIHBhcnRpdGlvbgotICoKLSAqIEBwYXJ0X251bTogbnVtYmVyIG9mIHRoZSBwYXJ0aXRpb24geW91IHdhbnQgdG8gZ2V0IGluZm8gYWJvdXQKLSAqIEByZXR1cm46ICAgc3RydWN0IHBhcnRfaW5mbyogaW4gY2FzZSBvZiBzdWNjZXNzLCAwIGlmIGZhaWx1cmUKLSAqLwotCi1zdGF0aWMgc3RydWN0IHBhcnRfaW5mbyBwYXJ0Owotc3RhdGljIGludCBjdXJyZW50X3BhcnQgPSAtMTsKLQotc3RydWN0IHBhcnRfaW5mbyogamZmczJfcGFydF9pbmZvKGludCBwYXJ0X251bSkgewotCXZvaWQgKmpmZnMyX3ByaXZfc2F2ZWQgPSBwYXJ0LmpmZnMyX3ByaXY7Ci0KLQlwcmludGYoImpmZnMyX3BhcnRfaW5mbzogcGFydF9udW09JWlcbiIscGFydF9udW0pOwotCi0JaWYgKGN1cnJlbnRfcGFydCA9PSBwYXJ0X251bSkKLQkJcmV0dXJuICZwYXJ0OwotCi0JLyogdS1ib290IHBhcnRpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCWlmKHBhcnRfbnVtPT0wKXsKLQkJbWVtc2V0KCZwYXJ0LCAwLCBzaXplb2YocGFydCkpOwotCi0JCXBhcnQub2Zmc2V0PShjaGFyKikweDAwMDAwMDAwOwotCQlwYXJ0LnNpemU9MjU2KjEwMjQ7Ci0KLQkJLyogTWFyayB0aGUgc3RydWN0IGFzIHJlYWR5ICovCi0JCWN1cnJlbnRfcGFydCA9IHBhcnRfbnVtOwotCi0JCXByaW50ZigicGFydC5vZmZzZXQgPSAweCUwOHhcbiIsKHVuc2lnbmVkIGludClwYXJ0Lm9mZnNldCk7Ci0JCXByaW50ZigicGFydC5zaXplICAgPSAweCUwOHhcbiIsKHVuc2lnbmVkIGludClwYXJ0LnNpemUpOwotCX0KLQotCS8qIHByaW1hcnkgT1MrZmlybXdhcmUgcGFydGl0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlpZihwYXJ0X251bT09MSl7Ci0JCW1lbXNldCgmcGFydCwgMCwgc2l6ZW9mKHBhcnQpKTsKLQotCQlwYXJ0Lm9mZnNldD0oY2hhciopMHgwMDA0MDAwMDsKLQkJcGFydC5zaXplPTEwMjQqMTAyNDsKLQotCQkvKiBNYXJrIHRoZSBzdHJ1Y3QgYXMgcmVhZHkgKi8KLQkJY3VycmVudF9wYXJ0ID0gcGFydF9udW07Ci0KLQkJcHJpbnRmKCJwYXJ0Lm9mZnNldCA9IDB4JTA4eFxuIiwodW5zaWduZWQgaW50KXBhcnQub2Zmc2V0KTsKLQkJcHJpbnRmKCJwYXJ0LnNpemUgICA9IDB4JTA4eFxuIiwodW5zaWduZWQgaW50KXBhcnQuc2l6ZSk7Ci0JfQotCi0JLyogc2Vjb25kYXJ5IE9TK2Zpcm13YXJlIHBhcnRpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCWlmKHBhcnRfbnVtPT0yKXsKLQkJbWVtc2V0KCZwYXJ0LCAwLCBzaXplb2YocGFydCkpOwotCi0JCXBhcnQub2Zmc2V0PShjaGFyKikweDAwMTQwMDAwOwotCQlwYXJ0LnNpemU9OCoxMDI0KjEwMjQ7Ci0KLQkJLyogTWFyayB0aGUgc3RydWN0IGFzIHJlYWR5ICovCi0JCWN1cnJlbnRfcGFydCA9IHBhcnRfbnVtOwotCi0JCXByaW50ZigicGFydC5vZmZzZXQgPSAweCUwOHhcbiIsKHVuc2lnbmVkIGludClwYXJ0Lm9mZnNldCk7Ci0JCXByaW50ZigicGFydC5zaXplICAgPSAweCUwOHhcbiIsKHVuc2lnbmVkIGludClwYXJ0LnNpemUpOwotCX0KLQotCWlmIChjdXJyZW50X3BhcnQgPT0gcGFydF9udW0pIHsKLQkJcGFydC51c3JfcHJpdiA9ICZjdXJyZW50X3BhcnQ7Ci0JCXBhcnQuamZmczJfcHJpdiA9IGpmZnMyX3ByaXZfc2F2ZWQ7Ci0JCXJldHVybiAmcGFydDsKLQl9Ci0KLQlwcmludGYoImpmZnMyX3BhcnRfaW5mbzogZW5kIG9mIHBhcnRpdGlvbiB0YWJsZVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIHVuc2lnbmVkIGxvbmcgZmxhc2hfaW5pdCAodm9pZCkKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZmxhc2guYyBiL2NvbW1vbi9jbWRfZmxhc2guYwppbmRleCAzOTcyMDgyLi4wZmI0ZGJiIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2ZsYXNoLmMKKysrIGIvY29tbW9uL2NtZF9mbGFzaC5jCkBAIC0yNywxMyArMjcsMjIgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLQogI2lmZGVmIENPTkZJR19IQVNfREFUQUZMQVNICiAjaW5jbHVkZSA8ZGF0YWZsYXNoLmg+CiAjZW5kaWYKIAogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQogCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaW5jbHVkZSA8amZmczIvamZmczIuaD4KKworLyogcGFyaXRpb24gaGFuZGxpbmcgcm91dGluZXMgKi8KK2ludCBtdGRwYXJ0c19pbml0KHZvaWQpOworaW50IGlkX3BhcnNlKGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICoqcmV0X2lkLCB1OCAqZGV2X3R5cGUsIHU4ICpkZXZfbnVtKTsKK2ludCBmaW5kX2Rldl9hbmRfcGFydChjb25zdCBjaGFyICppZCwgc3RydWN0IG10ZF9kZXZpY2UgKipkZXYsCisJCXU4ICpwYXJ0X251bSwgc3RydWN0IHBhcnRfaW5mbyAqKnBhcnQpOworI2VuZGlmCisKIGV4dGVybiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tdOwkvKiBpbmZvIGZvciBGTEFTSCBjaGlwcyAqLwogCiAvKgpAQCAtMjk1LDExICszMDQsMTcgQEAKIAlmbGFzaF9wcmludF9pbmZvICgmZmxhc2hfaW5mb1tiYW5rLTFdKTsKIAlyZXR1cm4gMDsKIH0KKwogaW50IGRvX2ZsZXJhc2UgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWZsYXNoX2luZm9fdCAqaW5mbzsKIAl1bG9uZyBiYW5rLCBhZGRyX2ZpcnN0LCBhZGRyX2xhc3Q7CiAJaW50IG4sIHNlY3RfZmlyc3QsIHNlY3RfbGFzdDsKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKwlzdHJ1Y3QgbXRkX2RldmljZSAqZGV2OworCXN0cnVjdCBwYXJ0X2luZm8gKnBhcnQ7CisJdTggZGV2X3R5cGUsIGRldl9udW0sIHBudW07CisjZW5kaWYKIAlpbnQgcmNvZGUgPSAwOwogCiAJaWYgKGFyZ2MgPCAyKSB7CkBAIC0zMjcsNiArMzQyLDMyIEBACiAJCXJldHVybiByY29kZTsKIAl9CiAKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKwkvKiBlcmFzZSA8cGFydC1pZD4gLSBlcmFzZSBwYXJ0aXRpb24gKi8KKwlpZiAoKGFyZ2MgPT0gMikgJiYgKGlkX3BhcnNlKGFyZ3ZbMV0sIE5VTEwsICZkZXZfdHlwZSwgJmRldl9udW0pID09IDApKSB7CisJCW10ZHBhcnRzX2luaXQoKTsKKwkJaWYgKGZpbmRfZGV2X2FuZF9wYXJ0KGFyZ3ZbMV0sICZkZXYsICZwbnVtLCAmcGFydCkgPT0gMCkgeworCQkJaWYgKGRldi0+aWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05PUikgeworCQkJCWJhbmsgPSBkZXYtPmlkLT5udW07CisJCQkJaW5mbyA9ICZmbGFzaF9pbmZvW2JhbmtdOworCQkJCWFkZHJfZmlyc3QgPSBwYXJ0LT5vZmZzZXQgKyBpbmZvLT5zdGFydFswXTsKKwkJCQlhZGRyX2xhc3QgPSBhZGRyX2ZpcnN0ICsgcGFydC0+c2l6ZSAtIDE7CisKKwkJCQlwcmludGYgKCJFcmFzZSBGbGFzaCBQYXJpdGlvbiAlcywgIgorCQkJCQkJImJhbmsgJWQsIDB4JTA4bHggLSAweCUwOGx4ICIsCisJCQkJCQlhcmd2WzFdLCBiYW5rLCBhZGRyX2ZpcnN0LAorCQkJCQkJYWRkcl9sYXN0KTsKKworCQkJCXJjb2RlID0gZmxhc2hfc2VjdF9lcmFzZShhZGRyX2ZpcnN0LCBhZGRyX2xhc3QpOworCQkJCXJldHVybiByY29kZTsKKwkJCX0KKworCQkJcHJpbnRmKCJjYW5ub3QgZXJhc2UsIG5vdCBhIE5PUiBkZXZpY2VcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisjZW5kaWYKKwogCWlmIChhcmdjICE9IDMpIHsKIAkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKIAkJcmV0dXJuIDE7CkBAIC00MDEsNiArNDQyLDExIEBACiAJZmxhc2hfaW5mb190ICppbmZvOwogCXVsb25nIGJhbmssIGFkZHJfZmlyc3QsIGFkZHJfbGFzdDsKIAlpbnQgaSwgcCwgbiwgc2VjdF9maXJzdCwgc2VjdF9sYXN0OworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorCXN0cnVjdCBtdGRfZGV2aWNlICpkZXY7CisJc3RydWN0IHBhcnRfaW5mbyAqcGFydDsKKwl1OCBkZXZfdHlwZSwgZGV2X251bSwgcG51bTsKKyNlbmRpZgogCWludCByY29kZSA9IDA7CiAjaWZkZWYgQ09ORklHX0hBU19EQVRBRkxBU0gKIAlpbnQgc3RhdHVzOwpAQCAtNDg4LDYgKzUzNCwzMyBAQAogCiAJCXJldHVybiByY29kZTsKIAl9CisJCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisJLyogcHJvdGVjdCBvbi9vZmYgPHBhcnQtaWQ+ICovCisJaWYgKChhcmdjID09IDMpICYmIChpZF9wYXJzZShhcmd2WzJdLCBOVUxMLCAmZGV2X3R5cGUsICZkZXZfbnVtKSA9PSAwKSkgeworCQltdGRwYXJ0c19pbml0KCk7CisJCWlmIChmaW5kX2Rldl9hbmRfcGFydChhcmd2WzJdLCAmZGV2LCAmcG51bSwgJnBhcnQpID09IDApIHsKKwkJCWlmIChkZXYtPmlkLT50eXBlID09IE1URF9ERVZfVFlQRV9OT1IpIHsKKwkJCQliYW5rID0gZGV2LT5pZC0+bnVtOworCQkJCWluZm8gPSAmZmxhc2hfaW5mb1tiYW5rXTsKKwkJCQlhZGRyX2ZpcnN0ID0gcGFydC0+b2Zmc2V0ICsgaW5mby0+c3RhcnRbMF07CisJCQkJYWRkcl9sYXN0ID0gYWRkcl9maXJzdCArIHBhcnQtPnNpemUgLSAxOworCisJCQkJcHJpbnRmICgiJXNQcm90ZWN0IEZsYXNoIFBhcml0aW9uICVzLCAiCisJCQkJCQkiYmFuayAlZCwgMHglMDhseCAtIDB4JTA4bHhcbiIsCisJCQkJCQlwID8gIiIgOiAiVW4iLCBhcmd2WzFdLAorCQkJCQkJYmFuaywgYWRkcl9maXJzdCwgYWRkcl9sYXN0KTsKKworCQkJCXJjb2RlID0gZmxhc2hfc2VjdF9wcm90ZWN0IChwLCBhZGRyX2ZpcnN0LCBhZGRyX2xhc3QpOworCQkJCXJldHVybiByY29kZTsKKwkJCX0KKworCQkJcHJpbnRmKCJjYW5ub3QgJXNwcm90ZWN0LCBub3QgYSBOT1IgZGV2aWNlXG4iLAorCQkJCQlwID8gIiIgOiAidW4iKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorI2VuZGlmCiAKIAlpZiAoYXJnYyAhPSA0KSB7CiAJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CkBAIC02MDksNiArNjgyLDkgQEAKIAkidy9hZGRyICdzdGFydCcrJ2xlbictMVxuIgogCSJlcmFzZSBOOlNGWy1TTF1cbiAgICAtIGVyYXNlIHNlY3RvcnMgU0YtU0wgaW4gRkxBU0ggYmFuayAjIE5cbiIKIAkiZXJhc2UgYmFuayBOXG4gICAgLSBlcmFzZSBGTEFTSCBiYW5rICMgTlxuIgorI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorCSJlcmFzZSA8cGFydC1pZD5cbiAgICAtIGVyYXNlIHBhcnRpdGlvblxuIgorI2VuZGlmCiAJImVyYXNlIGFsbFxuICAgIC0gZXJhc2UgYWxsIEZMQVNIIGJhbmtzXG4iCiApOwogCkBAIC02MjMsNiArNjk5LDkgQEAKIAkicHJvdGVjdCBvbiAgTjpTRlstU0xdXG4iCiAJIiAgICAtIHByb3RlY3Qgc2VjdG9ycyBTRi1TTCBpbiBGTEFTSCBiYW5rICMgTlxuIgogCSJwcm90ZWN0IG9uICBiYW5rIE5cbiAgICAtIHByb3RlY3QgRkxBU0ggYmFuayAjIE5cbiIKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKwkicHJvdGVjdCBvbiA8cGFydC1pZD5cbiAgICAtIHByb3RlY3QgcGFydGl0aW9uXG4iCisjZW5kaWYKIAkicHJvdGVjdCBvbiAgYWxsXG4gICAgLSBwcm90ZWN0IGFsbCBGTEFTSCBiYW5rc1xuIgogCSJwcm90ZWN0IG9mZiBzdGFydCBlbmRcbiIKIAkiICAgIC0gbWFrZSBGTEFTSCBmcm9tIGFkZHIgJ3N0YXJ0JyB0byBhZGRyICdlbmQnIHdyaXRhYmxlXG4iCkBAIC02MzIsNiArNzExLDkgQEAKIAkicHJvdGVjdCBvZmYgTjpTRlstU0xdXG4iCiAJIiAgICAtIG1ha2Ugc2VjdG9ycyBTRi1TTCB3cml0YWJsZSBpbiBGTEFTSCBiYW5rICMgTlxuIgogCSJwcm90ZWN0IG9mZiBiYW5rIE5cbiAgICAtIG1ha2UgRkxBU0ggYmFuayAjIE4gd3JpdGFibGVcbiIKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKwkicHJvdGVjdCBvZmYgPHBhcnQtaWQ+XG4gICAgLSBtYWtlIHBhcnRpdGlvbiB3cml0YWJsZVxuIgorI2VuZGlmCiAJInByb3RlY3Qgb2ZmIGFsbFxuICAgIC0gbWFrZSBhbGwgRkxBU0ggYmFua3Mgd3JpdGFibGVcbiIKICk7CiAKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfamZmczIuYyBiL2NvbW1vbi9jbWRfamZmczIuYwppbmRleCA0NTcxM2EzLi4yMWVhY2MyIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2pmZnMyLmMKKysrIGIvY29tbW9uL2NtZF9qZmZzMi5jCkBAIC0xLDExICsxLDIzIEBACiAvKgogICogKEMpIENvcHlyaWdodCAyMDAyCiAgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKICAqIChDKSBDb3B5cmlnaHQgMjAwMgogICogUm9iZXJ0IFNjaHdlYmVsLCBQZW5ndXRyb25peCwgPHIuc2Nod2ViZWxAcGVuZ3V0cm9uaXguZGU+CisgKgogICogKEMpIENvcHlyaWdodCAyMDAzCiAgKiBLYWktVXdlIEJsb2VtLCBBdWVyc3dhbGQgR21iSCAmIENvIEtHLCA8bGludXgtZGV2ZWxvcG1lbnRAYXVlcnN3YWxkLmRlPgogICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAgIEFkZGVkIHN1cHBvcnQgZm9yIHJlYWRpbmcgZmxhc2ggcGFydGl0aW9uIHRhYmxlIGZyb20gZW52aXJvbm1lbnQuCisgKiAgIFBhcnNpbmcgcm91dGluZXMgYXJlIGJhc2VkIG9uIGRyaXZlci9tdGQvY21kbGluZS5jIGZyb20gdGhlIGxpbnV4IDIuNAorICogICBrZXJuZWwgdHJlZS4KKyAqCisgKiAgICRJZDogY21kbGluZXBhcnQuYyx2IDEuMTcgMjAwNC8xMS8yNiAxMToxODo0NyBsYXZpbmVuIEV4cCAkCisgKiAgIENvcHlyaWdodCAyMDAyIFNZU0dPIFJlYWwtVGltZSBTb2x1dGlvbnMgR21iSAorICoKICAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAgKiBwcm9qZWN0LgogICoKQEAgLTI2LDEwMyArMzgsMTcyNiBAQAogICovCiAKIC8qCi0gKiBCb290IHN1cHBvcnQKKyAqIFRocmVlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgdXNlZCBieSB0aGUgcGFyc2luZyByb3V0aW5lczoKKyAqCisgKiAncGFydGl0aW9uJyAtIGtlZXBzIGN1cnJlbnQgcGFydGl0aW9uIGlkZW50aWZpZXIKKyAqCisgKiBwYXJ0aXRpb24gIDo9IDxwYXJ0LWlkPgorICogPHBhcnQtaWQ+ICA6PSA8ZGV2LWlkPixwYXJ0X251bQorICoKKyAqIAorICogJ210ZGlkcycgLSBsaW51eCBrZXJuZWwgbXRkIGRldmljZSBpZCA8LT4gdS1ib290IGRldmljZSBpZCBtYXBwaW5nCisgKgorICogbXRkaWRzPTxpZG1hcD5bLDxpZG1hcD4sLi4uXQorICoKKyAqIDxpZG1hcD4gICAgOj0gPGRldi1pZD49PG10ZC1pZD4KKyAqIDxkZXYtaWQ+ICAgOj0gJ25hbmQnfCdub3InPGRldi1udW0+CisgKiA8ZGV2LW51bT4gIDo9IG10ZCBkZXZpY2UgbnVtYmVyLCAwLi4uCisgKiA8bXRkLWlkPiAgIDo9IHVuaXF1ZSBkZXZpY2UgdGFnIHVzZWQgYnkgbGludXgga2VybmVsIHRvIGZpbmQgbXRkIGRldmljZSAobXRkLT5uYW1lKQorICoKKyAqCisgKiAnbXRkcGFydHMnIC0gcGFydGl0aW9uIGxpc3QKKyAqCisgKiBtdGRwYXJ0cz1tdGRwYXJ0cz08bXRkLWRlZj5bOzxtdGQtZGVmPi4uLl0KKyAqCisgKiA8bXRkLWRlZj4gIDo9IDxtdGQtaWQ+OjxwYXJ0LWRlZj5bLDxwYXJ0LWRlZj4uLi5dCisgKiA8bXRkLWlkPiAgIDo9IHVuaXF1ZSBkZXZpY2UgdGFnIHVzZWQgYnkgbGludXgga2VybmVsIHRvIGZpbmQgbXRkIGRldmljZSAobXRkLT5uYW1lKQorICogPHBhcnQtZGVmPiA6PSA8c2l6ZT5bQDxvZmZzZXQ+XVs8bmFtZT5dWzxyby1mbGFnPl0KKyAqIDxzaXplPiAgICAgOj0gc3RhbmRhcmQgbGludXggbWVtc2l6ZSBPUiAnLScgdG8gZGVub3RlIGFsbCByZW1haW5pbmcgc3BhY2UKKyAqIDxvZmZzZXQ+ICAgOj0gcGFydGl0aW9uIHN0YXJ0IG9mZnNldCB3aXRoaW4gdGhlIGRldmljZQorICogPG5hbWU+ICAgICA6PSAnKCcgTkFNRSAnKScKKyAqIDxyby1mbGFnPiAgOj0gd2hlbiBzZXQgdG8gJ3JvJyBtYWtlcyBwYXJ0aXRpb24gcmVhZC1vbmx5IChub3QgdXNlZCwgcGFzc2VkIHRvIGtlcm5lbCkKKyAqCisgKiBOb3RlczoKKyAqIC0gZWFjaCA8bXRkLWlkPiB1c2VkIGluIG10ZHBhcnRzIG11c3QgYWxibyBleGlzdCBpbiAnbXRkZGlzJyBtYXBwaW5nCisgKiAtIGlmIHRoZSBhYm92ZSB2YXJpYWJsZXMgYXJlIG5vdCBzZXQgZGVmYXVsdHMgZm9yIGEgZ2l2ZW4gdGFyZ2V0IGFyZSB1c2VkCisgKgorICogRXhhbXBsZXM6CisgKgorICogMSBOT1IgRmxhc2gsIHdpdGggMSBzaW5nbGUgd3JpdGFibGUgcGFydGl0aW9uOgorICogbXRkaWRzPW5vcjA9ZWRiNzMxMi1ub3IKKyAqIG10ZHBhcnRzPW10ZHBhcnRzPWVkYjczMTItbm9yOi0KKyAqCisgKiAxIE5PUiBGbGFzaCB3aXRoIDIgcGFydGl0aW9ucywgMSBOQU5EIHdpdGggb25lCisgKiBtdGRpZHM9bm9yMD1lZGI3MzEyLW5vcixuYW5kMD1lZGI3MzEyLW5hbmQKKyAqIG10ZHBhcnRzPW10ZHBhcnRzPWVkYjczMTItbm9yOjI1NmsoQVJNYm9vdClybywtKHJvb3QpO2VkYjczMTItbmFuZDotKGhvbWUpCisgKgorICovCisKKy8qCisgKiBKRkZTMi9DUkFNRlMgc3VwcG9ydAogICovCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgotI2luY2x1ZGUgPHNfcmVjb3JkLmg+Ci0jaW5jbHVkZSA8amZmczIvbG9hZF9rZXJuZWwuaD4KLSNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKIAogI2luY2x1ZGUgPGNyYW1mcy9jcmFtZnNfZnMuaD4KIAorLyogZW5hYmxlL2Rpc2FibGUgZGVidWdnaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lCURFQlVHCisjdW5kZWYJREVCVUcKKworI2lmZGVmICBERUJVRworIyBkZWZpbmUgREVCVUdGKGZtdCwgYXJncy4uLikJcHJpbnRmKGZtdCAsIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIERFQlVHRihmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogc3BlY2lhbCBzaXplIHJlZmVycmluZyB0byBhbGwgdGhlIHJlbWFpbmluZyBzcGFjZSBpbiBhIHBhcnRpdGlvbiAqLworI2RlZmluZSBTSVpFX1JFTUFJTklORwkJMHhGRkZGRkZGRgorCisvKiBzcGVjaWFsIG9mZnNldCB2YWx1ZSwgaXQgaXMgdXNlZCB3aGVuIG5vdCBwcm92aWRlZCBieSB1c2VyCisgKgorICogdGhpcyB2YWx1ZSBpcyB1c2VkIHRlbXBvcmFyaWx5IGR1cmluZyBwYXJzaW5nLCBsYXRlciBzdWNoIG9mZmVzdHMKKyAqIGFyZSByZWNhbGN1bGF0ZWQgKi8KKyNkZWZpbmUgT0ZGU0VUX05PVF9TUEVDSUZJRUQJMHhGRkZGRkZGRgorCisvKiBtaW5pbXVtIHBhcnRpdGlvbiBzaXplICovCisjZGVmaW5lIE1JTl9QQVJUX1NJWkUJCTQwOTYKKworLyogdGhpcyBmbGFnIG5lZWRzIHRvIGJlIHNldCBpbiBwYXJ0X2luZm8gc3RydWN0IG1hc2tfZmxhZ3MKKyAqIGZpZWxkIGZvciByZWFkLW9ubHkgcGFydGl0aW9ucyAqLworI2RlZmluZSBNVERfV1JJVEVBQkxFCQkxCisKKyNpZmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorLyogZGVmYXVsdCB2YWx1ZXMgZm9yIG10ZGlkcyBhbmQgbXRkcGFydHMgdmFyaWFibGVzICovCisjaWYgZGVmaW5lZChNVERJRFNfREVGQVVMVCkKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtdGRpZHNfZGVmYXVsdCA9IE1URElEU19ERUZBVUxUOworI2Vsc2UKKyN3YXJuaW5nICJNVERJRFNfREVGQVVMVCBub3QgZGVmaW5lZCEiCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbXRkaWRzX2RlZmF1bHQgPSBOVUxMOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1URFBBUlRTX0RFRkFVTFQpCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbXRkcGFydHNfZGVmYXVsdCA9IE1URFBBUlRTX0RFRkFVTFQ7CisjZWxzZQorI3dhcm5pbmcgIk1URFBBUlRTX0RFRkFVTFQgbm90IGRlZmluZWQhIgorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG10ZHBhcnRzX2RlZmF1bHQgPSBOVUxMOworI2VuZGlmCisKKy8qIGNvcGllcyBvZiBsYXN0IHNlZW4gJ210ZGlkcycsICdtdGRwYXJ0cycgYW5kICdwYXJ0aXRpb24nIGVudiB2YXJpYWJsZXMgKi8KKyNkZWZpbmUgTVRESURTX01BWExFTgkJMTI4CisjZGVmaW5lIE1URFBBUlRTX01BWExFTgkJNTEyCisjZGVmaW5lIFBBUlRJVElPTl9NQVhMRU4JMTYKK3N0YXRpYyBjaGFyIGxhc3RfaWRzW01URElEU19NQVhMRU5dOworc3RhdGljIGNoYXIgbGFzdF9wYXJ0c1tNVERQQVJUU19NQVhMRU5dOworc3RhdGljIGNoYXIgbGFzdF9wYXJ0aXRpb25bUEFSVElUSU9OX01BWExFTl07CisKKy8qIGxvdyBsZXZlbCBqZmZzMiBjYWNoZSBjbGVhbmluZyByb3V0aW5lICovCitleHRlcm4gdm9pZCBqZmZzMl9mcmVlX2NhY2hlKHN0cnVjdCBwYXJ0X2luZm8gKnBhcnQpOworCisvKiBtdGRpZHMgbWFwcGluZyBsaXN0LCBmaWxsZWQgYnkgcGFyc2VfaWRzKCkgKi8KK3N0cnVjdCBsaXN0X2hlYWQgbXRkaWRzOworCisvKiBkZXZpY2UvcGFydGl0aW9uIGxpc3QsIHBhcnNlX2NtZGxpbmUoKSBwYXJzZXMgaW50byBoZXJlICovCitzdHJ1Y3QgbGlzdF9oZWFkIGRldmljZXM7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19KRkZTMl9DTURMSU5FICovCisKKy8qIGN1cnJlbnQgYWN0aXZlIGRldmljZSBhbmQgcGFydGl0aW9uIG51bWJlciAqLworc3RhdGljIHN0cnVjdCBtdGRfZGV2aWNlICpjdXJyZW50X2RldiA9IE5VTEw7CitzdGF0aWMgdTggY3VycmVudF9wYXJ0bnVtID0gMDsKKwogZXh0ZXJuIGludCBjcmFtZnNfY2hlY2sgKHN0cnVjdCBwYXJ0X2luZm8gKmluZm8pOwogZXh0ZXJuIGludCBjcmFtZnNfbG9hZCAoY2hhciAqbG9hZG9mZnNldCwgc3RydWN0IHBhcnRfaW5mbyAqaW5mbywgY2hhciAqZmlsZW5hbWUpOwogZXh0ZXJuIGludCBjcmFtZnNfbHMgKHN0cnVjdCBwYXJ0X2luZm8gKmluZm8sIGNoYXIgKmZpbGVuYW1lKTsKIGV4dGVybiBpbnQgY3JhbWZzX2luZm8gKHN0cnVjdCBwYXJ0X2luZm8gKmluZm8pOwogCi1zdGF0aWMgaW50IHBhcnRfbnVtPTA7CitzdGF0aWMgc3RydWN0IHBhcnRfaW5mbyogamZmczJfcGFydF9pbmZvKHN0cnVjdCBtdGRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwYXJ0X251bSk7CiAKLSNpZm5kZWYgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQKKy8qIGNvbW1hbmQgbGluZSBvbmx5IHJvdXRpbmVzICovCisjaWZkZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKIAotI2RlZmluZSBDRkdfSkZGU19TSU5HTEVfUEFSVAkxCitzdGF0aWMgc3RydWN0IG10ZGlkcyogaWRfZmluZF9ieV9tdGRfaWQoY29uc3QgY2hhciAqbXRkX2lkLCB1bnNpZ25lZCBpbnQgbXRkX2lkX2xlbik7CitzdGF0aWMgaW50IGRldmljZV9kZWwoc3RydWN0IG10ZF9kZXZpY2UgKmRldik7CiAKLXN0YXRpYyBzdHJ1Y3QgcGFydF9pbmZvIHBhcnQ7Ci0KLSNpZm5kZWYgQ09ORklHX0pGRlMyX05BTkQKLQotc3RydWN0IHBhcnRfaW5mbyoKLWpmZnMyX3BhcnRfaW5mbyhpbnQgcGFydF9udW0pCisvKioKKyAqIFBhcnNlcyBhIHN0cmluZyBpbnRvIGEgbnVtYmVyLiAgVGhlIG51bWJlciBzdG9yZWQgYXQgcHRyIGlzCisgKiBwb3RlbnRpYWxseSBzdWZmaXhlZCB3aXRoIEsgKGZvciBraWxvYnl0ZXMsIG9yIDEwMjQgYnl0ZXMpLAorICogTSAoZm9yIG1lZ2FieXRlcywgb3IgMTA0ODU3NiBieXRlcyksIG9yIEcgKGZvciBnaWdhYnl0ZXMsIG9yCisgKiAxMDczNzQxODI0KS4gIElmIHRoZSBudW1iZXIgaXMgc3VmZml4ZWQgd2l0aCBLLCBNLCBvciBHLCB0aGVuCisgKiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgbXVsdGlwbGllZCBieSBvbmUga2lsb2J5dGUsIG9uZQorICogbWVnYWJ5dGUsIG9yIG9uZSBnaWdhYnl0ZSwgcmVzcGVjdGl2ZWx5LgorICoKKyAqIEBwYXJhbSBwdHIgd2hlcmUgcGFyc2UgYmVnaW5zCisgKiBAcGFyYW0gcmV0cHRyIG91dHB1dCBwb2ludGVyIHRvIG5leHQgY2hhciBhZnRlciBwYXJzZSBjb21wbGV0ZXMgKG91dHB1dCkKKyAqIEByZXR1cm4gcmVzdWx0aW5nIHVuc2lnbmVkIGludAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1zaXplX3BhcnNlIChjb25zdCBjaGFyICpjb25zdCBwdHIsIGNvbnN0IGNoYXIgKipyZXRwdHIpCiB7Ci0JZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107CS8qIGluZm8gZm9yIEZMQVNIIGNoaXBzICovCisJdW5zaWduZWQgbG9uZyByZXQgPSBzaW1wbGVfc3RydG91bChwdHIsIChjaGFyICoqKXJldHB0ciwgMCk7CisKKwlzd2l0Y2ggKCoqcmV0cHRyKSB7CisJCWNhc2UgJ0cnOgorCQljYXNlICdnJzoKKwkJCXJldCA8PD0gMTA7CisJCWNhc2UgJ00nOgorCQljYXNlICdtJzoKKwkJCXJldCA8PD0gMTA7CisJCWNhc2UgJ0snOgorCQljYXNlICdrJzoKKwkJCXJldCA8PD0gMTA7CisJCQkoKnJldHB0cikrKzsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogRm9ybWF0IHN0cmluZyBkZXNjcmliaW5nIHN1cHBsaWVkIHNpemUuIFRoaXMgcm91dGluZSBkb2VzIHRoZSBvcHBvc2l0ZSBqb2IKKyAqIHRvIG1lbXNpemVfcGFyc2UoKS4gU2l6ZSBpbiBieXRlcyBpcyBjb252ZXJ0ZWQgdG8gc3RyaW5nIGFuZCBpZiBwb3NzaWJsZQorICogc2hvcnRlbmVkIGJ5IHVzaW5nIGsgKGtpbG9ieXRlcyksIG0gKG1lZ2FieXRlcykgb3IgZyAoZ2lnYWJ5dGVzKSBzdWZmaXguCisgKgorICogTm90ZSwgdGhhdCB0aGlzIHJvdXRpbmUgZG9lcyBub3QgY2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdywgaXQncyB0aGUgY2FsbGVyCisgKiB3aG8gbXVzdCBhc3N1cmUgZW5vdWdoIHNwYWNlLgorICoKKyAqIEBwYXJhbSBidWYgb3V0cHV0IGJ1ZmZlcgorICogQHBhcmFtIHNpemUgc2l6ZSB0byBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nCisgKi8KK3N0YXRpYyB2b2lkIG1lbXNpemVfZm9ybWF0KGNoYXIgKmJ1ZiwgdTMyIHNpemUpCit7CisjZGVmaW5lIFNJWkVfR0IgKCh1MzIpMTAyNCoxMDI0KjEwMjQpCisjZGVmaW5lIFNJWkVfTUIgKCh1MzIpMTAyNCoxMDI0KQorI2RlZmluZSBTSVpFX0tCICgodTMyKTEwMjQpCisKKwlpZiAoKHNpemUgJSBTSVpFX0dCKSA9PSAwKQorCQlzcHJpbnRmKGJ1ZiwgIiVsdWciLCBzaXplL1NJWkVfR0IpOworCWVsc2UgaWYgKChzaXplICUgU0laRV9NQikgPT0gMCkKKwkJc3ByaW50ZihidWYsICIlbHVtIiwgc2l6ZS9TSVpFX01CKTsKKwllbHNlIGlmIChzaXplICUgU0laRV9LQiA9PSAwKQorCQlzcHJpbnRmKGJ1ZiwgIiVsdWsiLCBzaXplL1NJWkVfS0IpOworCWVsc2UKKwkJc3ByaW50ZihidWYsICIlbHUiLCBzaXplKTsKK30KKworLyoqCisgKiBTYXZlIGN1cnJlbnQgZGV2aWNlIGFuZCBwYXJ0aXRpb24gaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgJ3BhcnRpdGlvbicuCisgKi8KK3N0YXRpYyB2b2lkIGN1cnJlbnRfc2F2ZSh2b2lkKQoreworCWNoYXIgYnVmWzE2XTsKKworCURFQlVHRigiLS0tIGN1cnJlbnRfc2F2ZSAtLS1cbiIpOworCisJaWYgKGN1cnJlbnRfZGV2KSB7CisJCXNwcmludGYoYnVmLCAiJXMlZCwlZCIsIE1URF9ERVZfVFlQRShjdXJyZW50X2Rldi0+aWQtPnR5cGUpLAorCQkJCQljdXJyZW50X2Rldi0+aWQtPm51bSwgY3VycmVudF9wYXJ0bnVtKTsKKworCQlzZXRlbnYoInBhcnRpdGlvbiIsIGJ1Zik7CisJCXN0cm5jcHkobGFzdF9wYXJ0aXRpb24sIGJ1ZiwgMTYpOworCisJCURFQlVHRigiPT4gcGFydGl0aW9uICVzXG4iLCBidWYpOworCX0gZWxzZSB7CisJCXNldGVudigicGFydGl0aW9uIiwgTlVMTCk7CisJCWxhc3RfcGFydGl0aW9uWzBdID0gJ1wwJzsKKworCQlERUJVR0YoIj0+IHBhcnRpdGlvbiBOVUxMXG4iKTsKKwl9Cit9CisKKy8qKgorICogUGVyZm9ybXMgc2FuaXR5IGNoZWNrIGZvciBzdXBwbGllZCBOT1IgZmxhc2ggcGFydGl0aW9uLiBUYWJsZSBvZiBleGlzdGluZworICogTk9SIGZsYXNoIGRldmljZXMgaXMgc2VhcmNoZWQgYW5kIHBhcnRpdGlvbiBkZXZpY2UgaXMgbG9jYXRlZC4gQWxpZ25tZW50CisgKiB3aXRoIHRoZSBncmFudWxhcml0eSBvZiBOT1IgZmxhc2ggc2VjdG9ycyBpcyB2ZXJpZmllZC4KKyAqCisgKiBAcGFyYW0gaWQgb2YgdGhlIHBhcmVudCBkZXZpY2UKKyAqIEBwYXJhbSBwYXJ0IHBhcnRpdGlvbiB0byB2YWxpZGF0ZQorICogQHJldHVybiAwIGlmIHBhcnRpdGlvbiBpcyB2YWxpZCwgMSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBwYXJ0X3ZhbGlkYXRlX25vcihzdHJ1Y3QgbXRkaWRzICppZCwgc3RydWN0IHBhcnRfaW5mbyAqcGFydCkKK3sKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GTEFTSCkKKwkvKiBpbmZvIGZvciBGTEFTSCBjaGlwcyAqLworCWV4dGVybiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsKKwlmbGFzaF9pbmZvX3QgKmZsYXNoOworCWludCBvZmZzZXRfYWxpZ25lZDsKKwl1MzIgZW5kX29mZnNldDsKIAlpbnQgaTsKIAotCWlmKHBhcnRfbnVtPT0wKXsKKwlmbGFzaCA9ICZmbGFzaF9pbmZvW2lkLT5udW1dOwogCi0JCWlmKHBhcnQudXNyX3ByaXY9PSh2b2lkKikxKQotCQkJcmV0dXJuICZwYXJ0OworCW9mZnNldF9hbGlnbmVkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZmxhc2gtPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCWlmICgoZmxhc2gtPnN0YXJ0W2ldIC0gZmxhc2gtPnN0YXJ0WzBdKSA9PSBwYXJ0LT5vZmZzZXQpIHsKKwkJCW9mZnNldF9hbGlnbmVkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChvZmZzZXRfYWxpZ25lZCA9PSAwKSB7CisJCXByaW50ZigiJXMlZDogcGFydGl0aW9uICglcykgc3RhcnQgb2Zmc2V0IGFsaWdubWVudCBpbmNvcnJlY3RcbiIsCisJCQkJTVREX0RFVl9UWVBFKGlkLT50eXBlKSwgaWQtPm51bSwgcGFydC0+bmFtZSk7CisJCXJldHVybiAxOworCX0KIAotCQltZW1zZXQoJnBhcnQsIDAsIHNpemVvZihwYXJ0KSk7CisJZW5kX29mZnNldCA9IHBhcnQtPm9mZnNldCArIHBhcnQtPnNpemU7CisJZm9yIChpID0gMDsgaSA8IGZsYXNoLT5zZWN0b3JfY291bnQ7IGkrKykgeworCQlpZiAoKGZsYXNoLT5zdGFydFtpXSAtIGZsYXNoLT5zdGFydFswXSkgPT0gZW5kX29mZnNldCkKKwkJCXJldHVybiAwOworCX0KIAotI2lmIGRlZmluZWQoQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUikKLQkJcGFydC5vZmZzZXQgPSAodW5zaWduZWQgY2hhciAqKSBmbGFzaF9pbmZvW0NGR19KRkZTMl9GSVJTVF9CQU5LXS5zdGFydFtDRkdfSkZGUzJfRklSU1RfU0VDVE9SXTsKKwlpZiAoZmxhc2gtPnNpemUgPT0gZW5kX29mZnNldCkKKwkJcmV0dXJuIDA7CisKKwlwcmludGYoIiVzJWQ6IHBhcnRpdGlvbiAoJXMpIHNpemUgYWxpZ25tZW50IGluY29ycmVjdFxuIiwKKwkJCU1URF9ERVZfVFlQRShpZC0+dHlwZSksIGlkLT5udW0sIHBhcnQtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogUGVyZm9ybXMgc2FuaXR5IGNoZWNrIGZvciBzdXBwbGllZCBOQU5EIGZsYXNoIHBhcnRpdGlvbi4gVGFibGUgb2YgZXhpc3RpbmcKKyAqIE5BTkQgZmxhc2ggZGV2aWNlcyBpcyBzZWFyY2hlZCBhbmQgcGFydGl0aW9uIGRldmljZSBpcyBsb2NhdGVkLiBBbGlnbm1lbnQKKyAqIHdpdGggdGhlIGdyYW51bGFyaXR5IG9mIG5hbmQgZXJhc2VzaXplIGlzIHZlcmlmaWVkLgorICoKKyAqIEBwYXJhbSBpZCBvZiB0aGUgcGFyZW50IGRldmljZQorICogQHBhcmFtIHBhcnQgcGFydGl0aW9uIHRvIHZhbGlkYXRlCisgKiBAcmV0dXJuIDAgaWYgcGFydGl0aW9uIGlzIHZhbGlkLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHBhcnRfdmFsaWRhdGVfbmFuZChzdHJ1Y3QgbXRkaWRzICppZCwgc3RydWN0IHBhcnRfaW5mbyAqcGFydCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorCS8qIGluZm8gZm9yIE5BTkQgY2hpcHMgKi8KKwlleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOworCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmQ7CisKKwluYW5kID0gJm5hbmRfZGV2X2Rlc2NbaWQtPm51bV07CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpKHBhcnQtPm9mZnNldCkgJSBuYW5kLT5lcmFzZXNpemUpIHsKKwkJcHJpbnRmKCIlcyVkOiBwYXJ0aXRpb24gKCVzKSBzdGFydCBvZmZzZXQgYWxpZ25tZW50IGluY29ycmVjdFxuIiwKKwkJCQlNVERfREVWX1RZUEUoaWQtPnR5cGUpLCBpZC0+bnVtLCBwYXJ0LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHBhcnQtPnNpemUgJSBuYW5kLT5lcmFzZXNpemUpIHsKKwkJcHJpbnRmKCIlcyVkOiBwYXJ0aXRpb24gKCVzKSBzaXplIGFsaWdubWVudCBpbmNvcnJlY3RcbiIsCisJCQkJTVREX0RFVl9UWVBFKGlkLT50eXBlKSwgaWQtPm51bSwgcGFydC0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOwogI2Vsc2UKLQkJcGFydC5vZmZzZXQgPSAodW5zaWduZWQgY2hhciAqKSBmbGFzaF9pbmZvW0NGR19KRkZTMl9GSVJTVF9CQU5LXS5zdGFydFswXTsKKwlyZXR1cm4gMTsKICNlbmRpZgorfQogCi0JCS8qIEZpZ3VyZSBvdXQgZmxhc2ggcGFydGl0aW9uIHNpemUgKi8KLQkJZm9yIChpID0gQ0ZHX0pGRlMyX0ZJUlNUX0JBTks7IGkgPCBDRkdfSkZGUzJfTlVNX0JBTktTK0NGR19KRkZTMl9GSVJTVF9CQU5LOyBpKyspCi0JCQlwYXJ0LnNpemUgKz0gZmxhc2hfaW5mb1tpXS5zaXplOworLyoqCisgKiBQZXJmb3JtcyBzYW5pdHkgY2hlY2sgZm9yIHN1cHBsaWVkIHBhcnRpdGlvbi4gT2Zmc2V0IGFuZCBzaXplIGFyZSB2ZXJpZmllZAorICogdG8gYmUgd2l0aGluIHZhbGlkIHJhbmdlLiBQYXJ0aXRpb24gdHlwZSBpcyBjaGVja2VkIGFuZCBlaXRoZXIKKyAqIHBhcnRzX3ZhbGlkYXRlX25vcigpIG9yIHBhcnRzX3ZhbGlkYXRlX25hbmQoKSBpcyBjYWxsZWQgd2l0aCB0aGUgYXJndW1lbnQKKyAqIG9mIHBhcnQuCisgKgorICogQHBhcmFtIGlkIG9mIHRoZSBwYXJlbnQgZGV2aWNlCisgKiBAcGFyYW0gcGFydCBwYXJ0aXRpb24gdG8gdmFsaWRhdGUKKyAqIEByZXR1cm4gMCBpZiBwYXJ0aXRpb24gaXMgdmFsaWQsIDEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcGFydF92YWxpZGF0ZShzdHJ1Y3QgbXRkaWRzICppZCwgc3RydWN0IHBhcnRfaW5mbyAqcGFydCkKK3sKKwlpZiAocGFydC0+c2l6ZSA9PSBTSVpFX1JFTUFJTklORykKKwkJcGFydC0+c2l6ZSA9IGlkLT5zaXplIC0gcGFydC0+b2Zmc2V0OwogCi0jaWYgZGVmaW5lZChDRkdfSkZGUzJfRklSU1RfU0VDVE9SKSAmJiAoQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUiA+IDApCi0JCXBhcnQuc2l6ZSAtPQotCQkJZmxhc2hfaW5mb1tDRkdfSkZGUzJfRklSU1RfQkFOS10uc3RhcnRbQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUl0gLQotCQkJZmxhc2hfaW5mb1tDRkdfSkZGUzJfRklSU1RfQkFOS10uc3RhcnRbMF07Ci0jZW5kaWYKLQotCQkvKiBNYXJrIHRoZSBzdHJ1Y3QgYXMgcmVhZHkgKi8KLQkJcGFydC51c3JfcHJpdj0odm9pZCopMTsKLQotCQlyZXR1cm4gJnBhcnQ7CisJaWYgKHBhcnQtPm9mZnNldCA+IGlkLT5zaXplKSB7CisJCXByaW50ZigiJXM6IG9mZnNldCAlMDhseCBiZXlvbmQgZmxhc2ggc2l6ZSAlMDhseFxuIiwKKwkJCQlpZC0+bXRkX2lkLCBwYXJ0LT5vZmZzZXQsIGlkLT5zaXplKTsKKwkJcmV0dXJuIDE7CiAJfQorCisJaWYgKChwYXJ0LT5vZmZzZXQgKyBwYXJ0LT5zaXplKSA8PSBwYXJ0LT5vZmZzZXQpIHsKKwkJcHJpbnRmKCIlcyVkOiBwYXJ0aXRpb24gKCVzKSBzaXplIHRvbyBiaWdcbiIsCisJCQkJTVREX0RFVl9UWVBFKGlkLT50eXBlKSwgaWQtPm51bSwgcGFydC0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChwYXJ0LT5vZmZzZXQgKyBwYXJ0LT5zaXplID4gaWQtPnNpemUpIHsKKwkJcHJpbnRmKCIlczogcGFydGl0aW9uaW5nIGV4Y2VlZHMgZmxhc2ggc2l6ZVxuIiwgaWQtPm10ZF9pZCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChpZC0+dHlwZSA9PSBNVERfREVWX1RZUEVfTkFORCkKKwkJcmV0dXJuIHBhcnRfdmFsaWRhdGVfbmFuZChpZCwgcGFydCk7CisJZWxzZSBpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05PUikKKwkJcmV0dXJuIHBhcnRfdmFsaWRhdGVfbm9yKGlkLCBwYXJ0KTsKKwllbHNlCisJCURFQlVHRigicGFydF92YWxpZGF0ZTogaW52YWxpZCBkZXYgdHlwZVxuIik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBEZWxldGUgc2VsZWN0ZWQgcGFydGl0aW9uIGZyb20gdGhlIHBhcnRpb24gbGlzdCBvZiB0aGUgc3BlY2lmaWVkIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZGV2IGRldmljZSB0byBkZWxldGUgcGFydGl0aW9uIGZyb20KKyAqIEBwYXJhbSBwYXJ0IHBhcnRpdGlvbiB0byBkZWxldGUKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHBhcnRfZGVsKHN0cnVjdCBtdGRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYXJ0X2luZm8gKnBhcnQpCit7CisJLyogaWYgdGhlcmUgaXMgb25seSBvbmUgcGFydGl0aW9uLCByZW1vdmUgd2hvbGUgZGV2aWNlICovCisJaWYgKGRldi0+bnVtX3BhcnRzID09IDEpCisJCXJldHVybiBkZXZpY2VfZGVsKGRldik7CisKKwkvKiBvdGhlcndpc2UganVzdCBkZWxldGUgdGhpcyBwYXJ0aXRpb24gKi8KKwkKKwlpZiAoZGV2ID09IGN1cnJlbnRfZGV2KSB7CisJCS8qIHdlIGFyZSBtb2R5ZmluZyBwYXJ0aXRpb25zIGZvciB0aGUgY3VycmVudCBkZXZpY2UsCisJCSAqIHVwZGF0ZSBjdXJyZW50ICovCisJCXN0cnVjdCBwYXJ0X2luZm8gKmN1cnJfcGk7CisJCWN1cnJfcGkgPSBqZmZzMl9wYXJ0X2luZm8oY3VycmVudF9kZXYsIGN1cnJlbnRfcGFydG51bSk7CisKKwkJaWYgKGN1cnJfcGkpIHsKKwkJCWlmIChjdXJyX3BpID09IHBhcnQpIHsKKwkJCQlwcmludGYoImN1cnJlbnQgcGFydGl0aW9uIGRlbGV0ZWQsIHJlc2V0dGluZyBjdXJyZW50IHRvIDBcbiIpOworCQkJCWN1cnJlbnRfcGFydG51bSA9IDA7CisJCQkJY3VycmVudF9zYXZlKCk7CisJCQl9IGVsc2UgaWYgKHBhcnQtPm9mZnNldCA8PSBjdXJyX3BpLT5vZmZzZXQpIHsKKwkJCQljdXJyZW50X3BhcnRudW0tLTsgCisJCQkJY3VycmVudF9zYXZlKCk7CisJCQl9CisJCX0KKwl9CisKKworCWpmZnMyX2ZyZWVfY2FjaGUocGFydCk7CisJbGlzdF9kZWwoJnBhcnQtPmxpbmspOworCWZyZWUocGFydCk7CisJZGV2LT5udW1fcGFydHMtLTsKKwogCXJldHVybiAwOwogfQogCi0jZWxzZSAvKiBDT05GSUdfSkZGUzJfTkFORCAqLwotCi1zdHJ1Y3QgcGFydF9pbmZvKgotamZmczJfcGFydF9pbmZvKGludCBwYXJ0X251bSkKKy8qKgorICogRGVsZXRlIGFsbCBwYXJ0aXRpb25zIGZyb20gcGFydHMgaGVhZCBsaXN0LCBmcmVlIG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gaGVhZCBsaXN0IG9mIHBhcnRpdGlvbnMgdG8gZGVsZXRlCisgKi8KK3N0YXRpYyB2b2lkIHBhcnRfZGVsYWxsKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7Ci0JaWYocGFydF9udW09PTApeworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqbjsKKwlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0X3RtcDsKIAotCQlpZihwYXJ0LnVzcl9wcml2PT0odm9pZCopMSkKLQkJCXJldHVybiAmcGFydDsKKwkvKiBjbGVhbiB0bXBfbGlzdCBhbmQgZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCBuLCBoZWFkKSB7CisJCXBhcnRfdG1wID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHBhcnRfaW5mbywgbGluayk7CiAKLQkJbWVtc2V0KCZwYXJ0LCAwLCBzaXplb2YocGFydCkpOwotCi0JCXBhcnQub2Zmc2V0ID0gKGNoYXIgKilDT05GSUdfSkZGUzJfTkFORF9PRkY7Ci0JCXBhcnQuc2l6ZSA9IENPTkZJR19KRkZTMl9OQU5EX1NJWkU7IC8qIHRoZSBiaWdnZXIgc2l6ZSB0aGUgc2xvd2VyIGpmZnMyICovCi0KLSNpZm5kZWYgQ09ORklHX0pGRlMyX05BTkRfREVWCi0jZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EX0RFViAwCi0jZW5kaWYKLQkJLyogbmFuZCBkZXZpY2Ugd2l0aCB0aGUgSkZGUzIgcGFyaXRpb24gcGx1cyAxICovCi0JCXBhcnQudXNyX3ByaXYgPSAodm9pZCopKENPTkZJR19KRkZTMl9OQU5EX0RFVisxKTsKLQkJcmV0dXJuICZwYXJ0OworCQlqZmZzMl9mcmVlX2NhY2hlKHBhcnRfdG1wKTsKKwkJbGlzdF9kZWwoZW50cnkpOworCQlmcmVlKHBhcnRfdG1wKTsKIAl9Cit9CisKKy8qKgorICogQWRkIG5ldyBwYXJ0aXRpb24gdG8gdGhlIHN1cHBsaWVkIHBhcnRpdGlvbiBsaXN0LiBNYWtlIHN1cmUgcGFydGl0aW9ucyBhcmUKKyAqIHNvcnRlZCBieSBvZmZzZXQgaW4gYXNjZW5kaW5nIG9yZGVyLgorICoKKyAqIEBwYXJhbSBoZWFkIGxpc3QgdGhpcyBwYXJ0aXRpb24gaXMgdG8gYmUgYWRkZWQgdG8KKyAqIEBwYXJhbSBuZXcgcGFydGl0aW9uIHRvIGJlIGFkZGVkCisgKi8KK3N0YXRpYyBpbnQgcGFydF9zb3J0X2FkZChzdHJ1Y3QgbXRkX2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCBwYXJ0X2luZm8gKm5ld19waSwgKmN1cnJfcGk7CisKKwkvKiBsaW5rIHBhcnRpdGlvbiB0byBwYXJyZW50IGRldiAqLworCXBhcnQtPmRldiA9IGRldjsKKworCWlmIChsaXN0X2VtcHR5KCZkZXYtPnBhcnRzKSkgeworCQlERUJVR0YoInBhcnRfc29ydF9hZGQ6IGxpc3QgZW1wdHlcbiIpOworCQlsaXN0X2FkZCgmcGFydC0+bGluaywgJmRldi0+cGFydHMpOworCQlyZXR1cm4gMDsKKwl9CisJCQorCW5ld19waSA9IGxpc3RfZW50cnkoJnBhcnQtPmxpbmssIHN0cnVjdCBwYXJ0X2luZm8sIGxpbmspOworCisJLyogZ2V0IGN1cnJlbnQgcGFydGl0aW9uIGluZm8gaWYgd2UgYXJlIHVwZGF0aW5nIGN1cnJlbnQgZGV2aWNlICovCisJY3Vycl9waSA9IE5VTEw7CisJaWYgKGRldiA9PSBjdXJyZW50X2RldikKKwkJY3Vycl9waSA9IGpmZnMyX3BhcnRfaW5mbyhjdXJyZW50X2RldiwgY3VycmVudF9wYXJ0bnVtKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZkZXYtPnBhcnRzKSB7CisJCXN0cnVjdCBwYXJ0X2luZm8gKnBpOworCisJCXBpID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHBhcnRfaW5mbywgbGluayk7CisKKwkJLyogYmUgY29tcGxpYW50IHdpdGgga2VybmVsIGNtZGxpbmUsIGFsbG93IG9ubHkgb25lIHBhcnRpdGlvbiBhdCBvZmZzZXQgemVybyAqLworCQlpZiAoKG5ld19waS0+b2Zmc2V0ID09IHBpLT5vZmZzZXQpICYmIChwaS0+b2Zmc2V0ID09IDApKSB7CisJCQlwcmludGYoImNhbm5vdCBhZGQgc2Vjb25kIHBhcnRpdGlvbiBhdCBvZmZzZXQgMFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWlmIChuZXdfcGktPm9mZnNldCA8PSBwaS0+b2Zmc2V0KSB7CisJCQlsaXN0X2FkZF90YWlsKCZwYXJ0LT5saW5rLCBlbnRyeSk7CisJCQkKKwkJCWlmIChjdXJyX3BpICYmIChwaS0+b2Zmc2V0IDw9IGN1cnJfcGktPm9mZnNldCkpIHsKKwkJCQkvKiB3ZSBhcmUgbW9keWZpbmcgcGFydGl0aW9ucyBmb3IgdGhlIGN1cnJlbnQKKwkJCQkgKiBkZXZpY2UsIHVwZGF0ZSBjdXJyZW50ICovCisJCQkJY3VycmVudF9wYXJ0bnVtKys7CisJCQkJY3VycmVudF9zYXZlKCk7CisJCQl9CisKKwkJCXJldHVybiAwOworCQl9CisJfQorCWxpc3RfYWRkX3RhaWwoJnBhcnQtPmxpbmssICZkZXYtPnBhcnRzKTsKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19KRkZTMl9OQU5EICovCi0jZW5kaWYgLyogaWZuZGVmIENGR19KRkZTX0NVU1RPTV9QQVJUICovCi0KLWludAotZG9famZmczJfZnNsb2FkKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQorLyoqCisgKiBBZGQgcHJvdmlkZWQgcGFydGl0aW9uIHRvIHRoZSBwYXJ0aXRpb24gbGlzdCBvZiBhIGdpdmVuIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZGV2IGRldmljZSB0byB3aGljaCBwYXJ0aXRpb24gaXMgYWRkZWQKKyAqIEBwYXJhbSBwYXJ0IHBhcnRpdGlvbiB0byBiZSBhZGRlZAorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcGFydF9hZGQoc3RydWN0IG10ZF9kZXZpY2UgKmRldiwgc3RydWN0IHBhcnRfaW5mbyAqcGFydCkKIHsKLQlzdHJ1Y3QgcGFydF9pbmZvKiBqZmZzMl9wYXJ0X2luZm8oaW50KTsKLQlpbnQgamZmczJfMXBhc3NfbG9hZChjaGFyICosIHN0cnVjdCBwYXJ0X2luZm8gKixjb25zdCBjaGFyICopOworCS8qIHZlcmlmeSBhbGlnbm1lbnQgYW5kIHNpemUgKi8JCisJaWYgKHBhcnRfdmFsaWRhdGUoZGV2LT5pZCwgcGFydCkgIT0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKiBwYXJ0aXRpb24gaXMgb2ssIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCWlmIChwYXJ0X3NvcnRfYWRkKGRldiwgcGFydCkgIT0gMCkKKwkJcmV0dXJuIDE7CisKKwlkZXYtPm51bV9wYXJ0cysrOworCXJldHVybiAwOworfQorCisvKioKKyAqIFBhcnNlIG9uZSBwYXJ0aXRpb24gZGVmaW5pdGlvbiwgYWxsb2NhdGUgbWVtb3J5IGFuZCByZXR1cm4gcG9pbnRlciB0byB0aGlzCisgKiBsb2NhdGlvbiBpbiByZXRwYXJ0LgorICoKKyAqIEBwYXJhbSBwYXJ0ZGVmIHBvaW50ZXIgdG8gdGhlIHBhcnRpdGlvbiBkZWZpbml0aW9uIHN0cmluZyBpLmUuIDxwYXJ0LWRlZj4KKyAqIEBwYXJhbSByZXQgb3V0cHV0IHBvaW50ZXIgdG8gbmV4dCBjaGFyIGFmdGVyIHBhcnNlIGNvbXBsZXRlcyAob3V0cHV0KQorICogQHBhcmFtIHJldHBhcnQgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIHBhcnRpdGlvbiAob3V0cHV0KQorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcGFydF9wYXJzZShjb25zdCBjaGFyICpjb25zdCBwYXJ0ZGVmLCBjb25zdCBjaGFyICoqcmV0LCBzdHJ1Y3QgcGFydF9pbmZvICoqcmV0cGFydCkKK3sKKwlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBuYW1lX2xlbjsKKwl1bnNpZ25lZCBpbnQgbWFza19mbGFnczsKKwljb25zdCBjaGFyICpwOworCisJcCA9IHBhcnRkZWY7CisJKnJldHBhcnQgPSBOVUxMOworCSpyZXQgPSBOVUxMOworCisJLyogZmV0Y2ggdGhlIHBhcnRpdGlvbiBzaXplICovCisJaWYgKCpwID09ICctJykgeworCQkvKiBhc3NpZ24gYWxsIHJlbWFpbmluZyBzcGFjZSB0byB0aGlzIHBhcnRpdGlvbiAqLworCQlERUJVR0YoIictJzogcmVtYWluaW5nIHNpemUgYXNzaWduZWRcbiIpOworCQlzaXplID0gU0laRV9SRU1BSU5JTkc7CisJCXArKzsKKwl9IGVsc2UgeworCQlzaXplID0gbWVtc2l6ZV9wYXJzZShwLCAmcCk7CisJCWlmIChzaXplIDwgTUlOX1BBUlRfU0laRSkgeworCQkJcHJpbnRmKCJwYXJ0aXRpb24gc2l6ZSB0b28gc21hbGwgKCVseClcbiIsIHNpemUpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKyAgICAgICAgLyogY2hlY2sgZm9yIG9mZnNldCAqLworCW9mZnNldCA9IE9GRlNFVF9OT1RfU1BFQ0lGSUVEOworCWlmICgqcCA9PSAnQCcpIHsKKwkJcCsrOworCQlvZmZzZXQgPSBtZW1zaXplX3BhcnNlKHAsICZwKTsKKwl9CisKKyAgICAgICAgLyogbm93IGxvb2sgZm9yIHRoZSBuYW1lICovCisJaWYgKCpwID09ICcoJykgeworCQluYW1lID0gKytwOworCQlpZiAoKHAgPSBzdHJjaHIobmFtZSwgJyknKSkgPT0gTlVMTCkgeworCQkJcHJpbnRmKCJubyBjbG9zaW5nICkgZm91bmQgaW4gcGFydGl0aW9uIG5hbWVcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbmFtZV9sZW4gPSBwIC0gbmFtZSArIDE7CisJCWlmICgobmFtZV9sZW4gLSAxKSA9PSAwKSB7CisJCQlwcmludGYoImVtcHR5IHBhcnRpdGlvbiBuYW1lXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXArKzsKKwl9IGVsc2UgeworCQkvKiAweDAwMDAwMDAwQDB4MDAwMDAwMDAgKi8KKwkJbmFtZV9sZW4gPSAyMjsKKwkJbmFtZSA9IE5VTEw7CisJfQorCisgICAgICAgIC8qIHRlc3QgZm9yIG9wdGlvbnMgKi8KKwltYXNrX2ZsYWdzID0gMDsKKwlpZiAoc3RybmNtcChwLCAicm8iLCAyKSA9PSAwKSB7CisJCW1hc2tfZmxhZ3MgfD0gTVREX1dSSVRFQUJMRTsKKwkJcCArPSAyOworCX0KKworCS8qIGNoZWNrIGZvciBuZXh0IHBhcnRpdGlvbiBkZWZpbml0aW9uICovCisJaWYgKCpwID09ICcsJykgeworCQlpZiAoc2l6ZSA9PSBTSVpFX1JFTUFJTklORykgeworCQkJKnJldCA9IE5VTEw7CisJCQlwcmludGYoIm5vIHBhcnRpdGlvbnMgYWxsb3dlZCBhZnRlciBhIGZpbGwtdXAgcGFydGl0aW9uXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCSpyZXQgPSArK3A7CisJfSBlbHNlIGlmICgoKnAgPT0gJzsnKSB8fCAoKnAgPT0gJ1wwJykpIHsKKwkJKnJldCA9IHA7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJ1bmV4cGVjdGVkIGNoYXJhY3RlciAnJWMnIGF0IHRoZSBlbmQgb2YgcGFydGl0aW9uXG4iLCAqcCk7CisJCSpyZXQgPSBOVUxMOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiAgYWxsb2NhdGUgbWVtb3J5ICovCisJcGFydCA9IChzdHJ1Y3QgcGFydF9pbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFydF9pbmZvKSArIG5hbWVfbGVuKTsKKwlpZiAoIXBhcnQpIHsKKwkJcHJpbnRmKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbXNldChwYXJ0LCAwLCBzaXplb2Yoc3RydWN0IHBhcnRfaW5mbykgKyBuYW1lX2xlbik7CisJcGFydC0+c2l6ZSA9IHNpemU7CisJcGFydC0+b2Zmc2V0ID0gb2Zmc2V0OworCXBhcnQtPm1hc2tfZmxhZ3MgPSBtYXNrX2ZsYWdzOworCXBhcnQtPm5hbWUgPSAoY2hhciAqKShwYXJ0ICsgMSk7CisKKwlpZiAobmFtZSkgeworCQkvKiBjb3B5IHVzZXIgcHJvdmlkZWQgbmFtZSAqLworCQlzdHJuY3B5KHBhcnQtPm5hbWUsIG5hbWUsIG5hbWVfbGVuIC0gMSk7CisJCXBhcnQtPmF1dG9fbmFtZSA9IDA7CisJfSBlbHNlIHsKKwkJLyogYXV0byBnZW5lcmF0ZWQgbmFtZSBpbiBmb3JtIG9mIHNpemVAb2Zmc2V0ICovCisJCXNwcmludGYocGFydC0+bmFtZSwgIjB4JTA4bHhAMHglMDhseCIsIHNpemUsIG9mZnNldCk7CisJCXBhcnQtPmF1dG9fbmFtZSA9IDE7CisJfQorCisJcGFydC0+bmFtZVtuYW1lX2xlbiAtIDFdID0gJ1wwJzsKKwlJTklUX0xJU1RfSEVBRCgmcGFydC0+bGluayk7CisKKwlERUJVR0YoIisgcGFydGl0aW9uOiBuYW1lICUtMjJzIHNpemUgMHglMDh4IG9mZnNldCAweCUwOHggbWFzayBmbGFncyAlZFxuIiwKKwkJCXBhcnQtPm5hbWUsIHBhcnQtPnNpemUsCisJCQlwYXJ0LT5vZmZzZXQsIHBhcnQtPm1hc2tfZmxhZ3MpOworCisJKnJldHBhcnQgPSBwYXJ0OworCXJldHVybiAwOworfQorI2VuZGlmLyogI2lmZGVmIENPTkZJR19KRkZTMl9DTURMSU5FICovCisKKy8qKgorICogQ2hlY2sgZGV2aWNlIG51bWJlciB0byBiZSB3aXRoaW4gdmFsaWQgcmFuZ2UgZm9yIGdpdmVuIGRldmljZSB0eXBlLgorICoKKyAqIEBwYXJhbSBkZXYgZGV2aWNlIHRvIHZhbGlkYXRlCisgKiBAcmV0dXJuIDAgaWYgZGV2aWNlIGlzIHZhbGlkLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGRldmljZV92YWxpZGF0ZSh1OCB0eXBlLCB1OCBudW0sIHUzMiAqc2l6ZSkKK3sKKwlpZiAodHlwZSA9PSBNVERfREVWX1RZUEVfTk9SKSB7CisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisJCWlmIChudW0gPCBDRkdfTUFYX0ZMQVNIX0JBTktTKSB7CisJCQlleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisJCQkqc2l6ZSA9IGZsYXNoX2luZm9bbnVtXS5zaXplOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlwcmludGYoIm5vIHN1Y2ggRkxBU0ggZGV2aWNlOiAlcyVkICh2YWxpZCByYW5nZSAwIC4uLiAlZFxuIiwKKwkJCQlNVERfREVWX1RZUEUodHlwZSksIG51bSwgQ0ZHX01BWF9GTEFTSF9CQU5LUyAtIDEpOworI2Vsc2UKKwkJcHJpbnRmKCJzdXBwb3J0IGZvciBGTEFTSCBkZXZpY2VzIG5vdCBwcmVzZW50XG4iKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAodHlwZSA9PSBNVERfREVWX1RZUEVfTkFORCkgeworI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisJCWlmIChudW0gPCBDRkdfTUFYX05BTkRfREVWSUNFKSB7CisJCQlleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOworCQkJKnNpemUgPSBuYW5kX2Rldl9kZXNjW251bV0udG90bGVuOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlwcmludGYoIm5vIHN1Y2ggTkFORCBkZXZpY2U6ICVzJWQgKHZhbGlkIHJhbmdlIDAgLi4uICVkKVxuIiwKKwkJCQlNVERfREVWX1RZUEUodHlwZSksIG51bSwgQ0ZHX01BWF9OQU5EX0RFVklDRSAtIDEpOworI2Vsc2UKKwkJcHJpbnRmKCJzdXBwb3J0IGZvciBOQU5EIGRldmljZXMgbm90IHByZXNlbnRcbiIpOworI2VuZGlmCisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorLyoqCisgKiBEZWxldGUgYWxsIG10ZCBkZXZpY2VzIGZyb20gYSBzdXBwbGllZCBkZXZpY2VzIGxpc3QsIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IKKyAqIGVhY2ggZGV2aWNlIGFuZCBkZWxldGUgYWxsIGRldmljZSBwYXJ0aXRpb25zLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGRldmljZV9kZWxhbGwoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKm47CisJc3RydWN0IG10ZF9kZXZpY2UgKmRldl90bXA7CisKKwkvKiBjbGVhbiBkZXZpY2VzIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIG4sIGhlYWQpIHsKKwkJZGV2X3RtcCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBtdGRfZGV2aWNlLCBsaW5rKTsKKwkJbGlzdF9kZWwoZW50cnkpOworCQlwYXJ0X2RlbGFsbCgmZGV2X3RtcC0+cGFydHMpOworCQlmcmVlKGRldl90bXApOworCX0KKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBJZiBwcm92aWRlZCBkZXZpY2UgZXhpc3RzIGl0J3MgcGFydGl0aW9ucyBhcmUgZGVsZXRlZCwgZGV2aWNlIGlzIHJlbW92ZWQKKyAqIGZyb20gZGV2aWNlIGxpc3QgYW5kIGRldmljZSBtZW1vcnkgaXMgZnJlZWQuCisgKgorICogQHBhcmFtIGRldiBkZXZpY2UgdG8gYmUgZGVsZXRlZAorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgZGV2aWNlX2RlbChzdHJ1Y3QgbXRkX2RldmljZSAqZGV2KQoreworCXBhcnRfZGVsYWxsKCZkZXYtPnBhcnRzKTsKKwlsaXN0X2RlbCgmZGV2LT5saW5rKTsKKwlmcmVlKGRldik7CisKKwlpZiAoZGV2ID09IGN1cnJlbnRfZGV2KSB7CisJCS8qIHdlIGp1c3QgZGVsZXRlZCBjdXJyZW50IGRldmljZSAqLworCQlpZiAobGlzdF9lbXB0eSgmZGV2aWNlcykpIHsKKwkJCWN1cnJlbnRfZGV2ID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlc2V0IGZpcnN0IHBhcnRpdGlvbiBmcm9tIGZpcnN0IGRldiBmcm9tIHRoZQorCQkJICogZGV2aWNlcyBsaXN0IGFzIGN1cnJlbnQgKi8KKwkJCWN1cnJlbnRfZGV2ID0gbGlzdF9lbnRyeShkZXZpY2VzLm5leHQsIHN0cnVjdCBtdGRfZGV2aWNlLCBsaW5rKTsKKwkJCWN1cnJlbnRfcGFydG51bSA9IDA7CisJCX0KKwkJY3VycmVudF9zYXZlKCk7CisJfQorCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTZWFyY2ggZ2xvYmFsIGRldmljZSBsaXN0IGFuZCByZXR1cm4gcG9pbnRlciB0byB0aGUgZGV2aWNlIG9mIHR5cGUgYW5kIG51bQorICogc3BlY2lmaWVkLgorICoKKyAqIEBwYXJhbSB0eXBlIGRldmljZSB0eXBlCisgKiBAcGFyYW0gbnVtIGRldmljZSBudW1iZXIKKyAqIEByZXR1cm4gTlVMTCBpZiByZXF1ZXN0ZWQgZGV2aWNlIGRvZXMgbm90IGV4aXN0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX2RldmljZSogZGV2aWNlX2ZpbmQodTggdHlwZSwgdTggbnVtKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCBtdGRfZGV2aWNlICpkZXZfdG1wOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmRldmljZXMpIHsKKwkJZGV2X3RtcCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBtdGRfZGV2aWNlLCBsaW5rKTsKKworCQlpZiAoKGRldl90bXAtPmlkLT50eXBlID09IHR5cGUpICYmIChkZXZfdG1wLT5pZC0+bnVtID09IG51bSkpCisJCQlyZXR1cm4gZGV2X3RtcDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBBZGQgc3BlY2lmaWVkIGRldmljZSB0byB0aGUgZ2xvYmFsIGRldmljZSBsaXN0LgorICoKKyAqIEBwYXJhbSBkZXYgZGV2aWNlIHRvIGJlIGFkZGVkCisgKi8KK3N0YXRpYyB2b2lkIGRldmljZV9hZGQoc3RydWN0IG10ZF9kZXZpY2UgKmRldikKK3sKKwlpZiAobGlzdF9lbXB0eSgmZGV2aWNlcykpIHsKKwkJY3VycmVudF9kZXYgPSBkZXY7CisJCWN1cnJlbnRfcGFydG51bSA9IDA7CisJCWN1cnJlbnRfc2F2ZSgpOworCX0KKworCWxpc3RfYWRkX3RhaWwoJmRldi0+bGluaywgJmRldmljZXMpOworfQorCisvKioKKyAqIFBhcnNlIGRldmljZSB0eXBlLCBuYW1lIGFuZCBtdGQtaWQuIElmIHN5bnRheCBpcyBvayBhbGxvY2F0ZSBtZW1vcnkgYW5kCisgKiByZXR1cm4gcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gbXRkX2RldiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgZGVmaW5pdGlvbiBzdHJpbmcgaS5lLiA8bXRkLWRldj4KKyAqIEBwYXJhbSByZXQgb3V0cHV0IHBvaW50ZXIgdG8gbmV4dCBjaGFyIGFmdGVyIHBhcnNlIGNvbXBsZXRlcyAob3V0cHV0KQorICogQHBhcmFtIHJldGRldiBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgZGV2aWNlIChvdXRwdXQpCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgMSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBkZXZpY2VfcGFyc2UoY29uc3QgY2hhciAqY29uc3QgbXRkX2RldiwgY29uc3QgY2hhciAqKnJldCwgc3RydWN0IG10ZF9kZXZpY2UgKipyZXRkZXYpCit7CisJc3RydWN0IG10ZF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OworCXN0cnVjdCBtdGRpZHMgKmlkOworCWNvbnN0IGNoYXIgKm10ZF9pZDsKKwl1bnNpZ25lZCBpbnQgbXRkX2lkX2xlbjsKKwljb25zdCBjaGFyICpwLCAqcGVuZDsKKwlMSVNUX0hFQUQodG1wX2xpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqbjsKKwl1MTYgbnVtX3BhcnRzOworCXUzMiBvZmZzZXQ7CisJaW50IGVyciA9IDE7CisKKwlwID0gbXRkX2RldjsKKwkqcmV0ZGV2ID0gTlVMTDsKKwkqcmV0ID0gTlVMTDsKKworCURFQlVHRigiPT09ZGV2aWNlX3BhcnNlPT09XG4iKTsKKworCS8qIGZldGNoIDxtdGQtaWQ+ICovCisJbXRkX2lkID0gcDsKKwlpZiAoIShwID0gc3RyY2hyKG10ZF9pZCwgJzonKSkpIHsKKwkJcHJpbnRmKCJubyA8bXRkLWlkPiBpZGVudGlmaWVyXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCW10ZF9pZF9sZW4gPSBwIC0gbXRkX2lkICsgMTsKKwlwKys7CisKKwkvKiB2ZXJpZnkgaWYgd2UgaGF2ZSBhIHZhbGlkIGRldmljZSBzcGVjaWZpZWQgKi8KKwlpZiAoKGlkID0gaWRfZmluZF9ieV9tdGRfaWQobXRkX2lkLCBtdGRfaWRfbGVuIC0gMSkpID09IE5VTEwpIHsKKwkJcHJpbnRmKCJpbnZhbGlkIG10ZCBkZXZpY2UgJyUuKnMnXG4iLCBtdGRfaWRfbGVuIC0gMSwgbXRkX2lkKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCURFQlVHRigiZGV2IHR5cGUgPSAlZCAoJXMpLCBkZXYgbnVtID0gJWQsIG10ZC1pZCA9ICVzXG4iLCAKKwkJCWlkLT50eXBlLCBNVERfREVWX1RZUEUoaWQtPnR5cGUpLAorCQkJaWQtPm51bSwgaWQtPm10ZF9pZCk7CisJcGVuZCA9IHN0cmNocihwLCAnOycpOworCURFQlVHRigicGFyc2luZyBwYXJ0aXRpb25zICUuKnNcbiIsIChwZW5kID8gcGVuZCAtIHAgOiBzdHJsZW4ocCkpLCBwKTsKKworCisJLyogcGFyc2UgcGFydGl0aW9ucyAqLworCW51bV9wYXJ0cyA9IDA7CisKKwlvZmZzZXQgPSAwOworCWlmICgoZGV2ID0gZGV2aWNlX2ZpbmQoaWQtPnR5cGUsIGlkLT5udW0pKSAhPSBOVUxMKSB7CisJCS8qIGlmIGRldmljZSBhbHJlYWR5IGV4aXN0cyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHBhcnRpdGlvbiAqLyAKKwkJcGFydCA9IGxpc3RfZW50cnkoZGV2LT5wYXJ0cy5wcmV2LCBzdHJ1Y3QgcGFydF9pbmZvLCBsaW5rKTsKKwkJb2Zmc2V0ID0gcGFydC0+b2Zmc2V0ICsgcGFydC0+c2l6ZTsKKwl9CisKKwl3aGlsZSAocCAmJiAoKnAgIT0gJ1wwJykgJiYgKCpwICE9ICc7JykpIHsKKwkJZXJyID0gMTsKKwkJaWYgKChwYXJ0X3BhcnNlKHAsICZwLCAmcGFydCkgIT0gMCkgfHwgKCFwYXJ0KSkKKwkJCWJyZWFrOworCisJCS8qIGNhbGN1bGF0ZSBvZmZzZXQgd2hlbiBub3Qgc3BlY2lmaWVkICovCisJCWlmIChwYXJ0LT5vZmZzZXQgPT0gT0ZGU0VUX05PVF9TUEVDSUZJRUQpCisJCQlwYXJ0LT5vZmZzZXQgPSBvZmZzZXQ7CisJCWVsc2UKKwkJCW9mZnNldCA9IHBhcnQtPm9mZnNldDsKKworCQkvKiB2ZXJpZnkgYWxpZ25tZW50IGFuZCBzaXplICovCQorCQlpZiAocGFydF92YWxpZGF0ZShpZCwgcGFydCkgIT0gMCkKKwkJCWJyZWFrOworCisJCW9mZnNldCArPSBwYXJ0LT5zaXplOworCisJCS8qIHBhcnRpdGlvbiBpcyBvaywgYWRkIGl0IHRvIHRoZSBsaXN0ICovCisJCWxpc3RfYWRkX3RhaWwoJnBhcnQtPmxpbmssICZ0bXBfbGlzdCk7CisJCW51bV9wYXJ0cysrOworCQllcnIgPSAwOworCX0KKwlpZiAoZXJyID09IDEpIHsKKwkJcGFydF9kZWxhbGwoJnRtcF9saXN0KTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG51bV9wYXJ0cyA9PSAwKSB7CisJCXByaW50Zigibm8gcGFydGl0aW9ucyBmb3IgZGV2aWNlICVzJWQgKCVzKVxuIiwKKwkJCQlNVERfREVWX1RZUEUoaWQtPnR5cGUpLCBpZC0+bnVtLCBpZC0+bXRkX2lkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJREVCVUdGKCJcbnRvdGFsIHBhcnRpdGlvbnM6ICVkXG4iLCBudW1fcGFydHMpOworCisJLyogY2hlY2sgZm9yIG5leHQgZGV2aWNlIHByZXNlbmNlICovCisJaWYgKHApIHsKKwkJaWYgKCpwID09ICc7JykgeworCQkJKnJldCA9ICsrcDsKKwkJfSBlbHNlIGlmICgqcCA9PSAnXDAnKSB7CisJCQkqcmV0ID0gcDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigidW5leHBlY3RlZCBjaGFyYWN0ZXIgJyVjJyBhdCB0aGUgZW5kIG9mIGRldmljZVxuIiwgKnApOworCQkJKnJldCA9IE5VTEw7CisJCQlyZXR1cm4gMTsJCQorCQl9CisJfQorCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBtdGRfZGV2aWNlIHN0cnVjdHVyZSAqLworCWlmICgoZGV2ID0gKHN0cnVjdCBtdGRfZGV2aWNlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2RldmljZSkpKSA9PSBOVUxMKSB7CisJCXByaW50Zigib3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IG10ZF9kZXZpY2UpKTsKKwlkZXYtPmlkID0gaWQ7CisJZGV2LT5udW1fcGFydHMgPSBudW1fcGFydHM7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+cGFydHMpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmxpbmspOworCisJLyogbW92ZSBwYXJ0aXRpb25zIGZyb20gdG1wX2xpc3QgdG8gZGV2LT5wYXJ0cyAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgbiwgJnRtcF9saXN0KSB7CisJCXBhcnQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgcGFydF9pbmZvLCBsaW5rKTsKKwkJbGlzdF9kZWwoZW50cnkpOworCQlpZiAocGFydF9zb3J0X2FkZChkZXYsIHBhcnQpICE9IDApIHsKKwkJCWRldmljZV9kZWwoZGV2KTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJKnJldGRldiA9IGRldjsKKworCURFQlVHRigiPT09XG5cbiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIEluaXRpYWxpemUgZ2xvYmFsIGRldmljZSBsaXN0LgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGRldmljZXNfaW5pdCh2b2lkKQoreworCWxhc3RfcGFydHNbMF0gPSAnXDAnOworCWN1cnJlbnRfZGV2ID0gTlVMTDsKKwljdXJyZW50X3NhdmUoKTsKKworCXJldHVybiBkZXZpY2VfZGVsYWxsKCZkZXZpY2VzKTsKK30KKworLyoKKyAqIFNlYXJjaCBnbG9iYWwgbXRkaWRzIGxpc3QgYW5kIGZpbmQgaWQgb2YgcmVxdWVzdGVkIHR5cGUgYW5kIG51bWJlci4KKyAqCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIGlkIGlmIGl0IGV4aXN0cywgTlVMTCBvdGhlcndpc2UKKyAqLworc3RhdGljIHN0cnVjdCBtdGRpZHMqIGlkX2ZpbmQodTggdHlwZSwgdTggbnVtKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCBtdGRpZHMgKmlkOworCQorCWxpc3RfZm9yX2VhY2goZW50cnksICZtdGRpZHMpIHsKKwkJaWQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgbXRkaWRzLCBsaW5rKTsKKworCQlpZiAoKGlkLT50eXBlID09IHR5cGUpICYmIChpZC0+bnVtID09IG51bSkpCisJCQlyZXR1cm4gaWQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogU2VhcmNoIGdsb2JhbCBtdGRpZHMgbGlzdCBhbmQgZmluZCBpZCBvZiBhIHJlcXVlc3RlZCBtdGRfaWQuIAorICoKKyAqIE5vdGU6IGZpcnN0IGFyZ3VtZW50IGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQuCisgKgorICogQHBhcmFtIG10ZF9pZCBzdHJpbmcgY29udGFpbmluZyByZXF1ZXN0ZWQgbXRkX2lkCisgKiBAcGFyYW0gbXRkX2lkX2xlbiBsZW5ndGggb2Ygc3VwcGxpZWQgbXRkX2lkCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIGlkIGlmIGl0IGV4aXN0cywgTlVMTCBvdGhlcndpc2UKKyAqLworc3RhdGljIHN0cnVjdCBtdGRpZHMqIGlkX2ZpbmRfYnlfbXRkX2lkKGNvbnN0IGNoYXIgKm10ZF9pZCwgdW5zaWduZWQgaW50IG10ZF9pZF9sZW4pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJc3RydWN0IG10ZGlkcyAqaWQ7CisJCisJREVCVUdGKCItLS0gaWRfZmluZF9ieV9tdGRfaWQ6ICclLipzJyAobGVuID0gJWQpXG4iLAorCQkJbXRkX2lkX2xlbiwgbXRkX2lkLCBtdGRfaWRfbGVuKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZtdGRpZHMpIHsKKwkJaWQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgbXRkaWRzLCBsaW5rKTsKKworCQlERUJVR0YoImVudHJ5OiAnJXMnIChsZW4gPSAlZClcbiIsCisJCQkJaWQtPm10ZF9pZCwgc3RybGVuKGlkLT5tdGRfaWQpKTsKKworCQlpZiAobXRkX2lkX2xlbiAhPSBzdHJsZW4oaWQtPm10ZF9pZCkpCisJCQljb250aW51ZTsKKwkJaWYgKHN0cm5jbXAoaWQtPm10ZF9pZCwgbXRkX2lkLCBtdGRfaWRfbGVuKSA9PSAwKQorCQkJcmV0dXJuIGlkOworCX0KKworCXJldHVybiBOVUxMOworfQorI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSkZGUzJfQ01ETElORSAqLworCisvKioKKyAqIFBhcnNlIGRldmljZSBpZCBzdHJpbmcgPGRldi1pZD4gOj0gJ25hbmQnfCdub3InPGRldi1udW0+LCByZXR1cm4gZGV2aWNlCisgKiB0eXBlIGFuZCBudW1iZXIuCisgKgorICogQHBhcmFtIGlkIHN0cmluZyBkZXNjcmliaW5nIGRldmljZSBpZAorICogQHBhcmFtIHJldF9pZCBvdXRwdXQgcG9pbnRlciB0byBuZXh0IGNoYXIgYWZ0ZXIgcGFyc2UgY29tcGxldGVzIChvdXRwdXQpCisgKiBAcGFyYW0gZGV2X3R5cGUgcGFyc2VkIGRldmljZSB0eXBlIChvdXRwdXQpCisgKiBAcGFyYW0gZGV2X251bSBwYXJzZWQgZGV2aWNlIG51bWJlciAob3V0cHV0KQorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlCisgKi8KK2ludCBpZF9wYXJzZShjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqKnJldF9pZCwgdTggKmRldl90eXBlLCB1OCAqZGV2X251bSkKK3sKKwljb25zdCBjaGFyICpwID0gaWQ7CisKKwkqZGV2X3R5cGUgPSAwOworCWlmIChzdHJuY21wKHAsICJuYW5kIiwgNCkgPT0gMCkgeworCQkqZGV2X3R5cGUgPSBNVERfREVWX1RZUEVfTkFORDsKKwkJcCArPSA0OworCX0gZWxzZSBpZiAoc3RybmNtcChwLCAibm9yIiwgMykgPT0gMCkgeworCQkqZGV2X3R5cGUgPSBNVERfREVWX1RZUEVfTk9SOworCQlwICs9IDM7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJpbmNvcnJlY3QgZGV2aWNlIHR5cGUgaW4gJXNcbiIsIGlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFpc2RpZ2l0KCpwKSkgeworCQlwcmludGYoImluY29ycmVjdCBkZXZpY2UgbnVtYmVyIGluICVzXG4iLCBpZCk7CisJCXJldHVybiAxOworCX0KKworCSpkZXZfbnVtID0gc2ltcGxlX3N0cnRvdWwocCwgKGNoYXIgKiopJnAsIDApOworCWlmIChyZXRfaWQpCisJCSpyZXRfaWQgPSBwOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKy8qKgorICogUHJvY2VzcyBhbGwgZGV2aWNlcyBhbmQgZ2VuZXJhdGUgY29ycmVzcG9uZGluZyBtdGRwYXJ0cyBzdHJpbmcgZGVzY3JpYmluZworICogYWxsIHBhcnRpdGlvbnMgb24gYWxsIGRldmljZXMuCisgKgorICogQHBhcmFtIGJ1ZiBvdXRwdXQgYnVmZmVyIGhvbGRpbmcgZ2VuZXJhdGVkIG10ZHBhcnRzIHN0cmluZyAob3V0cHV0KQorICogQHBhcmFtIGJ1ZmxlbiBidWZmZXIgc2l6ZQorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgZ2VuZXJhdGVfbXRkcGFydHMoY2hhciAqYnVmLCB1MzIgYnVmbGVuKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBlbnRyeSwgKmRlbnRyeTsKKwlzdHJ1Y3QgbXRkX2RldmljZSAqZGV2OworCXN0cnVjdCBwYXJ0X2luZm8gKnBhcnQsICpwcmV2X3BhcnQ7CisJY2hhciAqcCA9IGJ1ZjsKKwljaGFyIHRtcGJ1ZlszMl07CisJdTMyIHNpemUsIG9mZnNldCwgbGVuLCBwYXJ0X2NudDsKKwl1MzIgbWF4bGVuID0gYnVmbGVuIC0gMTsKKworCURFQlVHRigiLS0tIGdlbmVyYXRlX210ZHBhcnRzIC0tLVxuIik7CisKKwlpZiAobGlzdF9lbXB0eSgmZGV2aWNlcykpIHsKKwkJYnVmWzBdID0gJ1wwJzsKKwkJcmV0dXJuIDA7CisJfQorCQorCXNwcmludGYocCwgIm10ZHBhcnRzPSIpOworCXAgKz0gOTsKKworCWxpc3RfZm9yX2VhY2goZGVudHJ5LCAmZGV2aWNlcykgeworCQlkZXYgPSBsaXN0X2VudHJ5KGRlbnRyeSwgc3RydWN0IG10ZF9kZXZpY2UsIGxpbmspOworCQkKKwkJLyogY29weSBtdGRfaWQgKi8KKwkJbGVuID0gc3RybGVuKGRldi0+aWQtPm10ZF9pZCkgKyAxOworCQlpZiAobGVuID4gbWF4bGVuKQorCQkJZ290byBjbGVhbnVwOworCQltZW1jcHkocCwgZGV2LT5pZC0+bXRkX2lkLCBsZW4gLSAxKTsKKwkJcCArPSBsZW4gLSAxOworCQkqKHArKykgPSAnOic7CisJCW1heGxlbiAtPSBsZW47CisKKwkJLyogZm9ybWF0IHBhcnRpdGlvbnMgKi8KKwkJcHJldl9wYXJ0ID0gTlVMTDsKKwkJcGFydF9jbnQgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHBlbnRyeSwgJmRldi0+cGFydHMpIHsKKwkJCXBhcnQgPSBsaXN0X2VudHJ5KHBlbnRyeSwgc3RydWN0IHBhcnRfaW5mbywgbGluayk7CisJCQlzaXplID0gcGFydC0+c2l6ZTsKKwkJCW9mZnNldCA9IHBhcnQtPm9mZnNldDsKKwkJCXBhcnRfY250Kys7CisKKwkJCS8qIHBhcnRpdGlvbiBzaXplICovCisJCQltZW1zaXplX2Zvcm1hdCh0bXBidWYsIHNpemUpOworCQkJbGVuID0gc3RybGVuKHRtcGJ1Zik7CisJCQlpZiAobGVuID4gbWF4bGVuKQorCQkJCWdvdG8gY2xlYW51cDsKKwkJCW1lbWNweShwLCB0bXBidWYsIGxlbik7CisJCQlwICs9IGxlbjsKKwkJCW1heGxlbiAtPSBsZW47CisJCQkKKwkJCQorCQkJLyogYWRkIG9mZnNldCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBnYXAgYmV0d2VlbgorCQkJICogcGFydGl0aW9ucyAqLworCQkJaWYgKCghcHJldl9wYXJ0ICYmIChvZmZzZXQgIT0gMCkpIHx8CisJCQkJCShwcmV2X3BhcnQgJiYgKChwcmV2X3BhcnQtPm9mZnNldCArIHByZXZfcGFydC0+c2l6ZSkgIT0gcGFydC0+b2Zmc2V0KSkpIHsKKworCQkJCW1lbXNpemVfZm9ybWF0KHRtcGJ1Ziwgb2Zmc2V0KTsKKwkJCQlsZW4gPSBzdHJsZW4odG1wYnVmKSArIDE7CisJCQkJaWYgKGxlbiA+IG1heGxlbikKKwkJCQkJZ290byBjbGVhbnVwOworCQkJCSoocCsrKSA9ICdAJzsKKwkJCQltZW1jcHkocCwgdG1wYnVmLCBsZW4gLSAxKTsKKwkJCQlwICs9IGxlbiAtIDE7CisJCQkJbWF4bGVuIC09IGxlbjsKKwkJCX0KKworCQkJLyogY29weSBuYW1lIG9ubHkgaWYgdXNlciBzdXBwbGllZCAqLworCQkJaWYoIXBhcnQtPmF1dG9fbmFtZSkgeworCQkJCWxlbiA9IHN0cmxlbihwYXJ0LT5uYW1lKSArIDI7CisJCQkJaWYgKGxlbiA+IG1heGxlbikKKwkJCQkJZ290byBjbGVhbnVwOworCisJCQkJKihwKyspID0gJygnOworCQkJCW1lbWNweShwLCBwYXJ0LT5uYW1lLCBsZW4gLSAyKTsKKwkJCQlwICs9IGxlbiAtIDI7CisJCQkJKihwKyspID0gJyknOworCQkJCW1heGxlbiAtPSBsZW47CisJCQl9CisJCQkKKwkJCS8qIHJvIG1hc2sgZmxhZyAqLworCQkJaWYgKHBhcnQtPm1hc2tfZmxhZ3MgJiYgTVREX1dSSVRFQUJMRSkgeworCQkJCWxlbiA9IDI7CisJCQkJaWYgKGxlbiA+IG1heGxlbikKKwkJCQkJZ290byBjbGVhbnVwOworCQkJCSoocCsrKSA9ICdyJzsKKwkJCQkqKHArKykgPSAnbyc7CisJCQkJbWF4bGVuIC09IDI7CisJCQl9CisKKwkJCS8qIHByaW50ICcsJyBzZXBhcmF0b3IgaWYgdGhlcmUgYXJlIG90aGVyIHBhcnRpdGlvbnMKKwkJCSAqIGZvbGxvd2luZyAqLworCQkJaWYgKGRldi0+bnVtX3BhcnRzID4gcGFydF9jbnQpIHsKKwkJCQlpZiAoMSA+IG1heGxlbikKKwkJCQkJZ290byBjbGVhbnVwOworCQkJCSoocCsrKSA9ICcsJzsKKwkJCQltYXhsZW4tLTsKKwkJCX0KKwkJCXByZXZfcGFydCA9IHBhcnQ7CisJCX0KKwkJLyogcHJpbnQgJzsnIHNlcGFyYXRvciBpZiB0aGVyZSBhcmUgb3RoZXIgZGV2aWNlcyBmb2xsb3dpbmcgKi8KKwkJaWYgKGRlbnRyeS0+bmV4dCAhPSAmZGV2aWNlcykgeworCQkJaWYgKDEgPiBtYXhsZW4pCisJCQkJZ290byBjbGVhbnVwOworCQkJKihwKyspID0gJzsnOworCQkJbWF4bGVuLS07CisJCX0KKwl9CisKKwkvKiB3ZSBzdGlsbCBoYXZlIGF0IGxlYXN0IG9uZSBjaGFyIGxlZnQsIGFzIHdlIGRlY3JlbWVudGVkIG1heGxlbiBhdAorCSAqIHRoZSBiZWdpbmluZyAqLworCSpwID0gJ1wwJzsKKworCXJldHVybiAwOworCitjbGVhbnVwOgorCWxhc3RfcGFydHNbMF0gPSAnXDAnOworCXJldHVybiAxOworfQorCisvKioKKyAqIENhbGwgZ2VuZXJhdGVfbXRkcGFydHMgdG8gcHJvY2VzcyBhbGwgZGV2aWNlcyBhbmQgZ2VuZXJhdGUgY29ycmVzcG9uZGluZworICogbXRkcGFydHMgc3RyaW5nLCBzYXZlIGl0IGluIG10ZHBhcnRzIGVudmlyb25tZW50IHZhcmlhYmxlLgorICoKKyAqIEBwYXJhbSBidWYgb3V0cHV0IGJ1ZmZlciBob2xkaW5nIGdlbmVyYXRlZCBtdGRwYXJ0cyBzdHJpbmcgKG91dHB1dCkKKyAqIEBwYXJhbSBidWZsZW4gYnVmZmVyIHNpemUKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGdlbmVyYXRlX210ZHBhcnRzX3NhdmUoY2hhciAqYnVmLCB1MzIgYnVmbGVuKQoreworCWludCByZXQ7CisKKwlyZXQgPSBnZW5lcmF0ZV9tdGRwYXJ0cyhidWYsIGJ1Zmxlbik7CisKKwlpZiAoKGJ1ZlswXSAhPSAnXDAnKSAmJiAocmV0ID09IDApKQorCQlzZXRlbnYoIm10ZHBhcnRzIiwgYnVmKTsKKwllbHNlCisJCXNldGVudigibXRkcGFydHMiLCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogRm9ybWF0IGFuZCBwcmludCBvdXQgYSBwYXJ0aXRpb24gbGlzdCBmb3IgZWFjaCBkZXZpY2UgZnJvbSBnbG9iYWwgZGV2aWNlCisgKiBsaXN0LgorICovCitzdGF0aWMgdm9pZCBsaXN0X3BhcnRpdGlvbnModm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpkZW50cnksICpwZW50cnk7CisJc3RydWN0IHBhcnRfaW5mbyAqcGFydDsKKwlzdHJ1Y3QgbXRkX2RldmljZSAqZGV2OworCWludCBwYXJ0X251bTsKKworCURFQlVHRigiXG4tLS1saXN0X3BhcnRpdGlvbnMtLS1cbiIpOworCWxpc3RfZm9yX2VhY2goZGVudHJ5LCAmZGV2aWNlcykgeworCQlkZXYgPSBsaXN0X2VudHJ5KGRlbnRyeSwgc3RydWN0IG10ZF9kZXZpY2UsIGxpbmspOworCQlwcmludGYoIlxuZGV2aWNlICVzJWQgPCVzPiwgIyBwYXJ0cyA9ICVkXG4iLAorCQkJCU1URF9ERVZfVFlQRShkZXYtPmlkLT50eXBlKSwgZGV2LT5pZC0+bnVtLAorCQkJCWRldi0+aWQtPm10ZF9pZCwgZGV2LT5udW1fcGFydHMpOworCQlwcmludGYoIiAjOiBuYW1lXHRcdFx0c2l6ZVx0XHRvZmZzZXRcdFx0bWFza19mbGFnc1xuIik7CisJCQorCQkvKiBsaXN0IHBhcnRpdGlvbnMgZm9yIGdpdmVuIGRldmljZSAqLworCQlwYXJ0X251bSA9IDA7CisJCWxpc3RfZm9yX2VhY2gocGVudHJ5LCAmZGV2LT5wYXJ0cykgeworCQkJcGFydCA9IGxpc3RfZW50cnkocGVudHJ5LCBzdHJ1Y3QgcGFydF9pbmZvLCBsaW5rKTsKKwkJCXByaW50ZigiICVkOiAlLTIyc1x0MHglMDh4XHQweCUwOHhcdCVkXG4iLAorCQkJCQlwYXJ0X251bSwgcGFydC0+bmFtZSwgcGFydC0+c2l6ZSwKKwkJCQkJcGFydC0+b2Zmc2V0LCBwYXJ0LT5tYXNrX2ZsYWdzKTsKKworCQkJcGFydF9udW0rKzsKKwkJfQorCX0KKwlpZiAobGlzdF9lbXB0eSgmZGV2aWNlcykpCisJCXByaW50Zigibm8gcGFydGl0aW9ucyBkZWZpbmVkXG4iKTsKKworCS8qIGN1cnJlbnRfZGV2IGlzIG5vdCBOVUxMIG9ubHkgd2hlbiB3ZSBoYXZlIG5vbiBlbXB0eSBkZXZpY2UgbGlzdCAqLworCWlmIChjdXJyZW50X2RldikgeworCQlwYXJ0ID0gamZmczJfcGFydF9pbmZvKGN1cnJlbnRfZGV2LCBjdXJyZW50X3BhcnRudW0pOworCQlpZiAocGFydCkgeworCQkJcHJpbnRmKCJcbmFjdGl2ZSBwYXJ0aXRpb246ICVzJWQsJWQgLSAoJXMpIDB4JTA4bHggQCAweCUwOGx4XG4iLAorCQkJCQlNVERfREVWX1RZUEUoY3VycmVudF9kZXYtPmlkLT50eXBlKSwKKwkJCQkJY3VycmVudF9kZXYtPmlkLT5udW0sIGN1cnJlbnRfcGFydG51bSwKKwkJCQkJcGFydC0+bmFtZSwgcGFydC0+c2l6ZSwgcGFydC0+b2Zmc2V0KTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiY291bGQgbm90IGdldCBjdXJyZW50IHBhcnRpdGlvbiBpbmZvXG5cbiIpOworCQl9CisJfQorCisJcHJpbnRmKCJcbmRlZmF1bHRzOlxuIik7CisJcHJpbnRmKCJtdGRpZHMgIDogJXNcbiIsIG10ZGlkc19kZWZhdWx0KTsKKwlwcmludGYoIm10ZHBhcnRzOiAlc1xuIiwgbXRkcGFydHNfZGVmYXVsdCk7Cit9CisKKy8qKgorICogR2l2ZW4gcGFydGl0aW9uIGlkZW50aWZpZXIgaW4gZm9ybSBvZiA8ZGV2X3R5cGU+PGRldl9udW0+LDxwYXJ0X251bT4gZmluZAorICogY29ycmVzcG9uZGluZyBkZXZpY2UgYW5kIHZlcmlmeSBwYXJ0aXRpb24gbnVtYmVyLgorICoKKyAqIEBwYXJhbSBpZCBzdHJpbmcgZGVzY3JpYmluZyBkZXZpY2UgYW5kIHBhcnRpdGlvbgorICogQHBhcmFtIGRldiBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIChvdXRwdXQpCisgKiBAcGFyYW0gcGFydF9udW0gdmVyaWZpZWQgcGFydGl0aW9uIG51bWJlciAob3V0cHV0KQorICogQHBhcmFtIHBhcnQgcG9pbnRlciB0byByZXF1ZXN0ZWQgcGFydGl0aW9uIChvdXRwdXQpCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgMSBvdGhlcndpc2UKKyAqLworaW50IGZpbmRfZGV2X2FuZF9wYXJ0KGNvbnN0IGNoYXIgKmlkLCBzdHJ1Y3QgbXRkX2RldmljZSAqKmRldiwKKwkJdTggKnBhcnRfbnVtLCBzdHJ1Y3QgcGFydF9pbmZvICoqcGFydCkKK3sKKwl1OCB0eXBlLCBkbnVtLCBwbnVtOworCWNvbnN0IGNoYXIgKnA7CisKKwlERUJVR0YoIi0tLSBmaW5kX2Rldl9hbmRfcGFydCAtLS1cbmlkID0gJXNcbiIsIGlkKTsKKworCXAgPSBpZDsKKwkqZGV2ID0gTlVMTDsKKwkqcGFydCA9IE5VTEw7CisJKnBhcnRfbnVtID0gMDsKKworCWlmIChpZF9wYXJzZShwLCAmcCwgJnR5cGUsICZkbnVtKSAhPSAwKQorCQlyZXR1cm4gMTsKKworCWlmICgoKnArKyAhPSAnLCcpIHx8ICgqcCA9PSAnXDAnKSkgeworCQlwcmludGYoIm5vIHBhcnRpdGlvbiBudW1iZXIgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXBudW0gPSBzaW1wbGVfc3RydG91bChwLCAoY2hhciAqKikmcCwgMCk7CisJaWYgKCpwICE9ICdcMCcpIHsKKwkJcHJpbnRmKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIGNoYXJhY3RlciAnJWMnXG4iLCAqcCk7CisJCXJldHVybiAxOworCX0KKwkKKwlpZiAoKCpkZXYgPSBkZXZpY2VfZmluZCh0eXBlLCBkbnVtKSkgPT0gTlVMTCkgeworCQlwcmludGYoIm5vIHN1Y2ggZGV2aWNlICVzJWRcbiIsIE1URF9ERVZfVFlQRSh0eXBlKSwgZG51bSk7CisJCXJldHVybiAxOworCX0KKworCWlmICgoKnBhcnQgPSBqZmZzMl9wYXJ0X2luZm8oKmRldiwgcG51bSkpID09IE5VTEwpIHsKKwkJcHJpbnRmKCJubyBzdWNoIHBhcnRpdGlvblxuIik7CisJCSpkZXYgPSBOVUxMOworCQlyZXR1cm4gMTsKKwl9CisKKwkqcGFydF9udW0gPSBwbnVtOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRmluZCBhbmQgZGVsZXRlIHBhcnRpdGlvbi4gRm9yIHBhcnRpdGlvbiBpZCBmb3JtYXQgc2VlIGZpbmRfZGV2X2FuZF9wYXJ0KCkuCisgKgorICogQHBhcmFtIGlkIHN0cmluZyBkZXNjcmliaW5nIGRldmljZSBhbmQgcGFydGl0aW9uCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgMSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBkZWxldGVfcGFydGl0aW9uKGNvbnN0IGNoYXIgKmlkKQoreworCXU4IHBudW07CisJc3RydWN0IG10ZF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OworCisJaWYgKGZpbmRfZGV2X2FuZF9wYXJ0KGlkLCAmZGV2LCAmcG51bSwgJnBhcnQpID09IDApIHsKKworCQlERUJVR0YoImRlbGV0ZV9wYXJ0aXRpb246IGRldmljZSA9ICVzJWQsIHBhcnRpdGlvbiAlZCA9ICglcykgMHglMDhseEAweCUwOGx4XG4iLAorCQkJCU1URF9ERVZfVFlQRShkZXYtPmlkLT50eXBlKSwgZGV2LT5pZC0+bnVtLCBwbnVtLAorCQkJCXBhcnQtPm5hbWUsIHBhcnQtPnNpemUsIHBhcnQtPm9mZnNldCk7CisKKwkJaWYgKHBhcnRfZGVsKGRldiwgcGFydCkgIT0gMCkKKwkJCXJldHVybiAxOworCisJCWlmIChnZW5lcmF0ZV9tdGRwYXJ0c19zYXZlKGxhc3RfcGFydHMsIE1URFBBUlRTX01BWExFTikgIT0gMCkgeworCQkJcHJpbnRmKCJnZW5lcmF0ZWQgbXRkcGFydHMgdG9vIGxvbmcsIHJlc2V0aW5nIHRvIG51bGxcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRmKCJwYXJ0aXRpb24gJXMgbm90IGZvdW5kXG4iLCBpZCk7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogQWNjZXB0IGNoYXJhY3RlciBzdHJpbmcgZGVzY3JpYmluZyBtdGQgcGFydGl0aW9ucyBhbmQgY2FsbCBkZXZpY2VfcGFyc2UoKQorICogZm9yIGVhY2ggZW50cnkuIEFkZCBjcmVhdGVkIGRldmljZXMgdG8gdGhlIGdsb2JhbCBkZXZpY2VzIGxpc3QuCisgKgorICogQHBhcmFtIG10ZHBhcnRzIHN0cmluZyBzcGVjaWZpbmcgbXRkIHBhcnRpdGlvbnMKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHBhcnNlX210ZHBhcnRzKGNvbnN0IGNoYXIgKmNvbnN0IG10ZHBhcnRzKQoreworCWNvbnN0IGNoYXIgKnAgPSBtdGRwYXJ0czsKKwlzdHJ1Y3QgbXRkX2RldmljZSAqZGV2OworCWludCBlcnIgPSAxOworCisJREVCVUdGKCJcbi0tLXBhcnNlX210ZHBhcnRzLS0tXG5tdGRwYXJ0cyA9ICVzXG5cbiIsIHApOworCisJLyogZGVsZXRlIGFsbCBkZXZpY2VzIGFuZCBwYXJ0aXRpb25zICovCisJaWYgKGRldmljZXNfaW5pdCgpICE9IDApIHsKKwkJcHJpbnRmKCJjb3VsZCBub3QgaW5pdGlhbGlzZSBkZXZpY2UgbGlzdFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogcmUtcmVhZCAnbXRkcGFydHMnIHZhcmlhYmxlLCBkZXZpY2VzX2luaXQgbWF5IGJlIHVwZGF0aW5nIGVudiAqLworCXAgPSBnZXRlbnYoIm10ZHBhcnRzIik7CisJCisJaWYgKHN0cm5jbXAocCwgIm10ZHBhcnRzPSIsIDkpICE9IDApIHsKKwkJcHJpbnRmKCJtdGRwYXJ0cyB2YXJpYWJsZSBkb2Vzbid0IHN0YXJ0IHdpdGggJ210ZHBhcnRzPSdcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwlwICs9IDk7CisKKwl3aGlsZSAocCAmJiAoKnAgIT0gJ1wwJykpIHsKKwkJZXJyID0gMTsKKwkJaWYgKChkZXZpY2VfcGFyc2UocCwgJnAsICZkZXYpICE9IDApIHx8ICghZGV2KSkKKwkJCWJyZWFrOworCisJCURFQlVHRigiKyBkZXZpY2U6ICVzXHQlZFx0JXNcbiIsIE1URF9ERVZfVFlQRShkZXYtPmlkLT50eXBlKSwKKwkJCQlkZXYtPmlkLT5udW0sIGRldi0+aWQtPm10ZF9pZCk7CisKKwkJLyogY2hlY2sgaWYgcGFyc2VkIGRldmljZSBpcyBhbHJlYWR5IG9uIHRoZSBsaXN0ICovCisJCWlmIChkZXZpY2VfZmluZChkZXYtPmlkLT50eXBlLCBkZXYtPmlkLT5udW0pICE9IE5VTEwpIHsKKwkJCXByaW50ZigiZGV2aWNlICVzJWQgcmVkZWZpbmVkLCBwbGVhc2UgY29ycmVjdCBtdGRwYXJ0cyB2YXJpYWJsZVxuIiwKKwkJCQkJTVREX0RFVl9UWVBFKGRldi0+aWQtPnR5cGUpLCBkZXYtPmlkLT5udW0pOworCQkJYnJlYWs7CisJCX0KKworCQlsaXN0X2FkZF90YWlsKCZkZXYtPmxpbmssICZkZXZpY2VzKTsKKwkJZXJyID0gMDsKKwl9CisJaWYgKGVyciA9PSAxKSB7CisJCWRldmljZV9kZWxhbGwoJmRldmljZXMpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBQYXJzZSBwcm92aWRlZCBzdHJpbmcgZGVzY3JpYmluZyBtdGRpZHMgbWFwcGluZyAoc2VlIGZpbGUgaGVhZGVyIGZvciBtdGRpZHMKKyAqIHZhcmlhYmxlIGZvcm1hdCkuIEFsbG9jYXRlIG1lbW9yeSBmb3IgZWFjaCBlbnRyeSBhbmQgYWRkIGFsbCBmb3VuZCBlbnRyaWVzCisgKiB0byB0aGUgZ2xvYmFsIG10ZGlkcyBsaXN0LgorICoKKyAqIEBwYXJhbSBpZHMgbWFwcGluZyBzdHJpbmcKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHBhcnNlX210ZGlkcyhjb25zdCBjaGFyICpjb25zdCBpZHMpCit7CisJY29uc3QgY2hhciAqcCA9IGlkczsKKwljb25zdCBjaGFyICptdGRfaWQ7CisJaW50IG10ZF9pZF9sZW47CisJc3RydWN0IG10ZGlkcyAqaWQ7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICpuOworCXN0cnVjdCBtdGRpZHMgKmlkX3RtcDsKKwl1OCB0eXBlLCBudW07CisJdTMyIHNpemU7CisJaW50IHJldCA9IDE7CisKKwlERUJVR0YoIlxuLS0tcGFyc2VfbXRkaWRzLS0tXG5tdGRpZHMgPSAlc1xuXG4iLCBpZHMpOworCisJLyogY2xlYW4gZ2xvYmFsIG10ZGlkcyBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCBuLCAmbXRkaWRzKSB7CisJCWlkX3RtcCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBtdGRpZHMsIGxpbmspOworCQlERUJVR0YoIm10ZGlkcyBkZWw6ICVkICVkXG4iLCBpZF90bXAtPnR5cGUsIGlkX3RtcC0+bnVtKTsKKwkJbGlzdF9kZWwoZW50cnkpOworCQlmcmVlKGlkX3RtcCk7CisJfQorCWxhc3RfaWRzWzBdID0gJ1wwJzsKKwlJTklUX0xJU1RfSEVBRCgmbXRkaWRzKTsKKworCXdoaWxlKHAgJiYgKCpwICE9ICdcMCcpKSB7CisKKwkJcmV0ID0gMTsKKwkJLyogcGFyc2UgJ25vcid8J25hbmQnPGRldi1udW0+ICovCisJCWlmIChpZF9wYXJzZShwLCAmcCwgJnR5cGUsICZudW0pICE9IDApCisJCQlicmVhazsKKworCQlpZiAoKnAgIT0gJz0nKSB7CisJCQlwcmludGYoIm10ZGlkczogaW5jb3JyZWN0IDxkZXYtbnVtPlxuIik7CisJCQlicmVhazsKKwkJfQorCQlwKys7CisKKwkJLyogY2hlY2sgaWYgcmVxdWVzdGVkIGRldmljZSBleGlzdHMgKi8KKwkJaWYgKGRldmljZV92YWxpZGF0ZSh0eXBlLCBudW0sICZzaXplKSAhPSAwKQorCQkJcmV0dXJuIDE7CisKKwkJLyogbG9jYXRlIDxtdGQtaWQ+ICovCisJCW10ZF9pZCA9IHA7CisJCWlmICgocCA9IHN0cmNocihtdGRfaWQsICcsJykpICE9IE5VTEwpIHsKKwkJCW10ZF9pZF9sZW4gPSBwIC0gbXRkX2lkICsgMTsKKwkJCXArKzsKKwkJfSBlbHNlIHsKKwkJCW10ZF9pZF9sZW4gPSBzdHJsZW4obXRkX2lkKSArIDE7CisJCX0KKwkJaWYgKG10ZF9pZF9sZW4gPT0gMCkgeworCQkJcHJpbnRmKCJtdGRpZHM6IG5vIDxtdGQtaWQ+IGlkZW50aWZpZXJcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBpZiB0aGlzIGlkIGlzIGFscmVhZHkgb24gdGhlIGxpc3QgKi8KKwkJaW50IGRvdWJsZV9lbnRyeSA9IDA7CisJCWxpc3RfZm9yX2VhY2goZW50cnksICZtdGRpZHMpIHsKKwkJCWlkX3RtcCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBtdGRpZHMsIGxpbmspOworCQkJaWYgKChpZF90bXAtPnR5cGUgPT0gdHlwZSkgJiYgKGlkX3RtcC0+bnVtID09IG51bSkpIHsKKwkJCQlkb3VibGVfZW50cnkgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChkb3VibGVfZW50cnkpIHsKKwkJCXByaW50ZigiZGV2aWNlIGlkICVzJWQgcmVkZWZpbmVkLCBwbGVhc2UgY29ycmVjdCBtdGRpZHMgdmFyaWFibGVcbiIsCisJCQkJCU1URF9ERVZfVFlQRSh0eXBlKSwgbnVtKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogYWxsb2NhdGUgbXRkaWRzIHN0cnVjdHVyZSAqLworCQlpZiAoIShpZCA9IChzdHJ1Y3QgbXRkaWRzICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkaWRzKSArIG10ZF9pZF9sZW4pKSkgeworCQkJcHJpbnRmKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCWJyZWFrOworCQl9CisJCW1lbXNldChpZCwgMCwgc2l6ZW9mKHN0cnVjdCBtdGRpZHMpICsgbXRkX2lkX2xlbik7CisJCWlkLT5udW0gPSBudW07CisJCWlkLT50eXBlID0gdHlwZTsKKwkJaWQtPnNpemUgPSBzaXplOworCQlpZC0+bXRkX2lkID0gKGNoYXIgKikoaWQgKyAxKTsKKwkJc3RybmNweShpZC0+bXRkX2lkLCBtdGRfaWQsIG10ZF9pZF9sZW4gLSAxKTsKKwkJaWQtPm10ZF9pZFttdGRfaWRfbGVuIC0gMV0gPSAnXDAnOworCQlJTklUX0xJU1RfSEVBRCgmaWQtPmxpbmspOworCisJCURFQlVHRigiKyBpZCAlcyVkXHQlMTZkIGJ5dGVzXHQlc1xuIiwKKwkJCQlNVERfREVWX1RZUEUoaWQtPnR5cGUpLCBpZC0+bnVtLAorCQkJCWlkLT5zaXplLCBpZC0+bXRkX2lkKTsKKworCQlsaXN0X2FkZF90YWlsKCZpZC0+bGluaywgJm10ZGlkcyk7CisJCXJldCA9IDA7CisJfQorCWlmIChyZXQgPT0gMSkgeworCQkvKiBjbGVhbiBtdGRpZHMgbGlzdCBhbmQgZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisJCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgbiwgJm10ZGlkcykgeworCQkJaWRfdG1wID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IG10ZGlkcywgbGluayk7CisJCQlsaXN0X2RlbChlbnRyeSk7CisJCQlmcmVlKGlkX3RtcCk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2UgYW5kIGluaXRpYWxpemUgZ2xvYmFsIG10ZGlkcyBtYXBwaW5nIGFuZCBjcmVhdGUgZ2xvYmFsCisgKiBkZXZpY2UvcGFydGl0aW9uIGxpc3QuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlCisgKi8KK2ludCBtdGRwYXJ0c19pbml0KHZvaWQpCit7CisJc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisJY29uc3QgY2hhciAqaWRzLCAqcGFydHM7CisJY29uc3QgY2hhciAqY3VycmVudF9wYXJ0aXRpb247CisJaW50IGlkc19jaGFuZ2VkOworCWNoYXIgdG1wX2VwW1BBUlRJVElPTl9NQVhMRU5dOworCisJREVCVUdGKCJcbi0tLW10ZHBhcnRzX2luaXQtLS1cbiIpOworCWlmICghaW5pdGlhbGl6ZWQpIHsKKwkJSU5JVF9MSVNUX0hFQUQoJm10ZGlkcyk7CisJCUlOSVRfTElTVF9IRUFEKCZkZXZpY2VzKTsKKwkJbWVtc2V0KGxhc3RfaWRzLCAwLCBNVERJRFNfTUFYTEVOKTsKKwkJbWVtc2V0KGxhc3RfcGFydHMsIDAsIE1URFBBUlRTX01BWExFTik7CisJCW1lbXNldChsYXN0X3BhcnRpdGlvbiwgMCwgUEFSVElUSU9OX01BWExFTik7CisJCWluaXRpYWxpemVkID0gMTsKKwl9CisKKwkvKiBnZXQgdmFyaWFibGVzICovCisJaWRzID0gZ2V0ZW52KCJtdGRpZHMiKTsKKwlwYXJ0cyA9IGdldGVudigibXRkcGFydHMiKTsKKwljdXJyZW50X3BhcnRpdGlvbiA9IGdldGVudigicGFydGl0aW9uIik7CisKKwkvKiBzYXZlIGl0IGZvciBsYXRlciBwYXJzaW5nLCBjYW5ub3QgcmVseSBvbiBjdXJyZW50IHBhcnRpdGlvbiBwb2ludGVyCisJICogYXMgJ3BhcnRpdGlvbicgdmFyaWFibGUgbWF5IGJlIHVwZGF0ZWQgZHVyaW5nIGluaXQgKi8KKwl0bXBfZXBbMF0gPSAnXDAnOworCWlmIChjdXJyZW50X3BhcnRpdGlvbikKKwkJc3RybmNweSh0bXBfZXAsIGN1cnJlbnRfcGFydGl0aW9uLCBQQVJUSVRJT05fTUFYTEVOKTsKKworCURFQlVHRigibGFzdF9pZHMgIDogJXNcbiIsIGxhc3RfaWRzKTsKKwlERUJVR0YoImVudl9pZHMgICA6ICVzXG4iLCBpZHMpOworCURFQlVHRigibGFzdF9wYXJ0czogJXNcbiIsIGxhc3RfcGFydHMpOworCURFQlVHRigiZW52X3BhcnRzIDogJXNcblxuIiwgcGFydHMpOworCisJREVCVUdGKCJsYXN0X3BhcnRpdGlvbiA6ICVzXG4iLCBsYXN0X3BhcnRpdGlvbik7CisJREVCVUdGKCJlbnZfcGFydGl0aW9uICA6ICVzXG4iLCBjdXJyZW50X3BhcnRpdGlvbik7CisKKwkvKiBpZiBtdGRpZHMgdmFyaWJsZSBpcyBlbXB0eSB0cnkgdG8gdXNlIGRlZmF1bHRzICovCisJaWYgKCFpZHMpIHsKKwkJaWYgKG10ZGlkc19kZWZhdWx0KSB7CisJCQlERUJVR0YoIm10ZGlkcyB2YXJpYWJsZSBub3QgZGVmaW5lZCwgdXNpbmcgZGVmYXVsdFxuIik7CisJCQlpZHMgPSBtdGRpZHNfZGVmYXVsdDsKKwkJCXNldGVudigibXRkaWRzIiwgKGNoYXIgKilpZHMpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJtdGRpZHMgbm90IGRlZmluZWQsIG5vIGRlZmF1bHQgcHJlc2VudFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlpZiAoc3RybGVuKGlkcykgPiBNVERJRFNfTUFYTEVOIC0gMSkgeworCQlwcmludGYoIm10ZGlkcyB0b28gbG9uZyAoPiAlZClcbiIsIE1URElEU19NQVhMRU4pOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBkbyBubyB0cnkgdG8gdXNlIGRlZmF1bHRzIHdoZW4gbXRkcGFydHMgdmFyaWFibGUgaXMgbm90IGRlZmluZWQsCisJICoganVzdCBjaGVjayB0aGUgbGVuZ3RoICovCisJaWYgKCFwYXJ0cykKKwkJcHJpbnRmKCJtdGRwYXJ0cyB2YXJpYWJsZSBub3Qgc2V0LCBzZWUgJ2hlbHAgbXRkcGFydHMnXG4iKTsKKworCWlmIChwYXJ0cyAmJiAoc3RybGVuKHBhcnRzKSA+IE1URFBBUlRTX01BWExFTiAtIDEpKSB7CisJCXByaW50ZigibXRkcGFydHMgdG9vIGxvbmcgKD4gJWQpXG4iLCBNVERQQVJUU19NQVhMRU4pOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgcGFyc2VkIHRob3NlIG10ZGlkcyAqLworCWlmICgobGFzdF9pZHNbMF0gIT0gJ1wwJykgJiYgKHN0cmNtcChsYXN0X2lkcywgaWRzKSA9PSAwKSkgeworCQlpZHNfY2hhbmdlZCA9IDA7CisJfSBlbHNlIHsKKwkJaWRzX2NoYW5nZWQgPSAxOworCisJCWlmIChwYXJzZV9tdGRpZHMoaWRzKSAhPSAwKSB7CisJCQlkZXZpY2VfZGVsYWxsKCZkZXZpY2VzKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogb2sgaXQncyBnb29kLCBzYXZlIG5ldyBpZHMgKi8KKwkJc3RybmNweShsYXN0X2lkcywgaWRzLCBNVERJRFNfTUFYTEVOKTsKKwl9CisKKwkvKiBwYXJzZSBwYXJ0aXRpb25zIGlmIGVpdGhlciBtdGRwYXJ0cyBvciBtdGRpZHMgd2VyZSB1cGRhdGVkICovCisJaWYgKHBhcnRzICYmICgobGFzdF9wYXJ0c1swXSA9PSAnXDAnKSB8fCAoKHN0cmNtcChsYXN0X3BhcnRzLCBwYXJ0cykgIT0gMCkpIHx8IGlkc19jaGFuZ2VkKSkgeworCQlpZiAocGFyc2VfbXRkcGFydHMocGFydHMpICE9IDApCisJCQlyZXR1cm4gMTsKKworCQlpZiAobGlzdF9lbXB0eSgmZGV2aWNlcykpIHsKKwkJCXByaW50ZigibXRkcGFydHNfaW5pdDogbm8gdmFsaWQgcGFydGl0aW9uc1xuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qIG9rIGl0J3MgZ29vZCwgc2F2ZSBuZXcgcGFydHMgKi8KKwkJc3RybmNweShsYXN0X3BhcnRzLCBwYXJ0cywgTVREUEFSVFNfTUFYTEVOKTsKKworCQkvKiByZXNldCBmaXJzdCBwYXJ0aXRpb24gZnJvbSBmaXJzdCBkZXYgZnJvbSB0aGUgbGlzdCBhcyBjdXJyZW50ICovCisJCWN1cnJlbnRfZGV2ID0gbGlzdF9lbnRyeShkZXZpY2VzLm5leHQsIHN0cnVjdCBtdGRfZGV2aWNlLCBsaW5rKTsKKwkJY3VycmVudF9wYXJ0bnVtID0gMDsKKwkJY3VycmVudF9zYXZlKCk7CisKKwkJREVCVUdGKCJtdGRwYXJ0c19pbml0OiBjdXJyZW50X2RldiAgPSAlcyVkLCBjdXJyZW50X3BhcnRudW0gPSAlZFxuIiwKKwkJCQlNVERfREVWX1RZUEUoY3VycmVudF9kZXYtPmlkLT50eXBlKSwKKwkJCQljdXJyZW50X2Rldi0+aWQtPm51bSwgY3VycmVudF9wYXJ0bnVtKTsKKwl9CisKKwkvKiBtdGRwYXJ0cyB2YXJpYWJsZSB3YXMgcmVzZXQgdG8gTlVMTCwgZGVsZXRlIGFsbCBkZXZpY2VzL3BhcnRpdGlvbnMgKi8KKwlpZiAoIXBhcnRzICYmIChsYXN0X3BhcnRzWzBdICE9ICdcMCcpKQorCQlyZXR1cm4gZGV2aWNlc19pbml0KCk7CisKKwkvKiBkbyBub3QgcHJvY2VzcyBjdXJyZW50IHBhcnRpdGlvbiBpZiBtdGRwYXJ0cyB2YXJpYWJsZSBpcyBudWxsICovCisJaWYgKCFwYXJ0cykKKwkJcmV0dXJuIDA7CisKKwkvKiBpcyBjdXJyZW50IHBhcnRpdGlvbiBzZXQgaW4gZW52aXJvbm1lbnQ/IGlmIHNvLCB1c2UgaXQgKi8KKwlpZiAoKHRtcF9lcFswXSAhPSAnXDAnKSAmJiAoc3RyY21wKHRtcF9lcCwgbGFzdF9wYXJ0aXRpb24pICE9IDApKSB7CisJCXN0cnVjdCBwYXJ0X2luZm8gKnA7CisJCXN0cnVjdCBtdGRfZGV2aWNlICpjZGV2OworCQl1OCBwbnVtOworCisJCURFQlVHRigiLS0tIGdldHRpbmcgY3VycmVudCBwYXJ0aXRpb246ICVzXG4iLCB0bXBfZXApOworCisJCWlmIChmaW5kX2Rldl9hbmRfcGFydCh0bXBfZXAsICZjZGV2LCAmcG51bSwgJnApID09IDApIHsKKwkJCWN1cnJlbnRfZGV2ID0gY2RldjsKKwkJCWN1cnJlbnRfcGFydG51bSA9IHBudW07CisJCQljdXJyZW50X3NhdmUoKTsKKwkJfQorCX0gZWxzZSBpZiAoZ2V0ZW52KCJwYXJ0aXRpb24iKSA9PSBOVUxMKSB7CisJCURFQlVHRigibm8gcGFydGl0aW9uIHZhcmlhYmxlIHNldCwgc2V0dGluZy4uLlxuIik7CisJCWN1cnJlbnRfc2F2ZSgpOworCX0KKworCXJldHVybiAwOworfQorI2Vsc2UgLyogI2lmZGVmIENPTkZJR19KRkZTMl9DTURMSU5FICovCisvKgorICogJ1N0YXRpYycgdmVyc2lvbiBvZiBjb21tYW5kIGxpbmUgbXRkcGFydHNfaW5pdCgpIHJvdXRpbmUuIFNpbmdsZSBwYXJ0aXRpb24gb24KKyAqIGEgc2luZ2xlIGRldmljZSBjb25maWd1cmF0aW9uLgorICovCisKKy8qKgorICogUGFyc2UgYW5kIGluaXRpYWxpemUgZ2xvYmFsIG10ZGlkcyBtYXBwaW5nIGFuZCBjcmVhdGUgZ2xvYmFsCisgKiBkZXZpY2UvcGFydGl0aW9uIGxpc3QuIAorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorICovCitpbnQgbXRkcGFydHNfaW5pdCh2b2lkKQoreworCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCXUzMiBzaXplOworCWNoYXIgKmRldl9uYW1lOworCisJREVCVUdGKCJcbi0tLW10ZHBhcnRzX2luaXQtLS1cbiIpOworCWlmICghaW5pdGlhbGl6ZWQpIHsKKwkJaW5pdGlhbGl6ZWQgPSAxOworCQljdXJyZW50X2RldiA9IChzdHJ1Y3QgbXRkX2RldmljZSAqKQorCQkJbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2RldmljZSkgKworCQkJCQlzaXplb2Yoc3RydWN0IHBhcnRfaW5mbykgKworCQkJCQlzaXplb2Yoc3RydWN0IG10ZGlkcykpOworCQlpZiAoIWN1cnJlbnRfZGV2KSB7CisJCQlwcmludGYoIm91dCBvZiBtZW1vcnlcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbWVtc2V0KGN1cnJlbnRfZGV2LCAwLCBzaXplb2Yoc3RydWN0IG10ZF9kZXZpY2UpICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBwYXJ0X2luZm8pICsgc2l6ZW9mKHN0cnVjdCBtdGRpZHMpKTsKKworCQlzdHJ1Y3QgbXRkaWRzICppZCA9IChzdHJ1Y3QgbXRkaWRzICopKGN1cnJlbnRfZGV2ICsgMSk7CisJCXN0cnVjdCBwYXJ0X2luZm8gKnBhcnQgPSAoc3RydWN0IHBhcnRfaW5mbyAqKShpZCArIDEpOworCisJCS8qIGlkICovCisJCWlkLT5tdGRfaWQgPSAic2luZ2xlIHBhcnQiOworCisjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfREVWKQorCQlkZXZfbmFtZSA9IENPTkZJR19KRkZTMl9ERVY7CisjZWxzZQorCQlkZXZfbmFtZSA9ICJub3IwIjsKKyNlbmRpZgorCisJCWlmICgoaWRfcGFyc2UoZGV2X25hbWUsIE5VTEwsICZpZC0+dHlwZSwgJmlkLT5udW0pICE9IDApIHx8CisJCQkJKGRldmljZV92YWxpZGF0ZShpZC0+dHlwZSwgaWQtPm51bSwgJnNpemUpICE9IDApKSB7CisJCQlwcmludGYoImluY29ycmVjdCBkZXZpY2U6ICVzJWRcbiIsIE1URF9ERVZfVFlQRShpZC0+dHlwZSksIGlkLT5udW0pOworCQkJZnJlZShjdXJyZW50X2Rldik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZC0+c2l6ZSA9IHNpemU7CisJCUlOSVRfTElTVF9IRUFEKCZpZC0+bGluayk7CisKKwkJREVCVUdGKCJkZXYgaWQ6IHR5cGUgPSAlZCwgbnVtID0gJWQsIHNpemUgPSAweCUwOGx4LCBtdGRfaWQgPSAlc1xuIiwKKwkJCQlpZC0+dHlwZSwgaWQtPm51bSwgaWQtPnNpemUsIGlkLT5tdGRfaWQpOworCisJCS8qIHBhcnRpdGlvbiAqLworCQlwYXJ0LT5uYW1lID0gInN0YXRpYyI7CisJCXBhcnQtPmF1dG9fbmFtZSA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9QQVJUX1NJWkUpCisJCXBhcnQtPnNpemUgPSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFOworI2Vsc2UKKwkJcGFydC0+c2l6ZSA9IFNJWkVfUkVNQUlOSU5HOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9QQVJUX09GRlNFVCkKKwkJcGFydC0+b2Zmc2V0ID0gQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUOworI2Vsc2UKKwkJcGFydC0+b2Zmc2V0ID0gMHgwMDAwMDAwMDsKKyNlbmRpZgorCisJCXBhcnQtPmRldiA9IGN1cnJlbnRfZGV2OworCQlJTklUX0xJU1RfSEVBRCgmcGFydC0+bGluayk7CisKKwkJLyogcmVjYWxjdWxhdGUgc2l6ZSBpZiBuZWVkZWQgKi8KKwkJaWYgKHBhcnQtPnNpemUgPT0gU0laRV9SRU1BSU5JTkcpCisJCQlwYXJ0LT5zaXplID0gaWQtPnNpemUgLSBwYXJ0LT5vZmZzZXQ7CisKKwkJREVCVUdGKCJwYXJ0ICA6IG5hbWUgPSAlcywgc2l6ZSA9IDB4JTA4bHgsIG9mZnNldCA9IDB4JTA4bHhcbiIsCisJCQkJcGFydC0+bmFtZSwgcGFydC0+c2l6ZSwgcGFydC0+b2Zmc2V0KTsKKworCQkvKiBkZXZpY2UgKi8KKwkJY3VycmVudF9kZXYtPmlkID0gaWQ7CisJCUlOSVRfTElTVF9IRUFEKCZjdXJyZW50X2Rldi0+bGluayk7CisJCWN1cnJlbnRfZGV2LT5udW1fcGFydHMgPSAxOworCQlJTklUX0xJU1RfSEVBRCgmY3VycmVudF9kZXYtPnBhcnRzKTsKKwkJbGlzdF9hZGQoJnBhcnQtPmxpbmssICZjdXJyZW50X2Rldi0+cGFydHMpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSkZGUzJfQ01ETElORSAqLworCisvKioKKyAqIFJldHVybiBwb2ludGVyIHRvIHRoZSBwYXJ0aXRpb24gb2YgYSByZXF1ZXN0ZWQgbnVtYmVyIGZyb20gYSByZXF1ZXN0ZWQKKyAqIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZGV2IGRldmljZSB0aGF0IGlzIHRvIGJlIHNlYXJjaGVkIGZvciBhIHBhcnRpdGlvbgorICogQHBhcmFtIHBhcnRfbnVtIHJlcXVlc3RlZCBwYXJ0aXRpb24gbnVtYmVyCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIHBhcnRfaW5mbywgTlVMTCBvdGhlcndpc2UKKyAqLworc3RhdGljIHN0cnVjdCBwYXJ0X2luZm8qIGpmZnMyX3BhcnRfaW5mbyhzdHJ1Y3QgbXRkX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcGFydF9udW0pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJc3RydWN0IHBhcnRfaW5mbyAqcGFydDsKKwlpbnQgbnVtOworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJREVCVUdGKCJcbi0tLSBqZmZzMl9wYXJ0X2luZm86IHBhcnRpdGlvbiBudW1iZXIgJWQgZm9yIGRldmljZSAlcyVkICglcylcbiIsCisJCQlwYXJ0X251bSwgTVREX0RFVl9UWVBFKGRldi0+aWQtPnR5cGUpLAorCQkJZGV2LT5pZC0+bnVtLCBkZXYtPmlkLT5tdGRfaWQpOworCisJaWYgKHBhcnRfbnVtID49IGRldi0+bnVtX3BhcnRzKSB7CisJCXByaW50ZigiaW52YWxpZCBwYXJ0aXRpb24gbnVtYmVyICVkIGZvciBkZXZpY2UgJXMlZCAoJXMpXG4iLAorCQkJCXBhcnRfbnVtLCBNVERfREVWX1RZUEUoZGV2LT5pZC0+dHlwZSksCisJCQkJZGV2LT5pZC0+bnVtLCBkZXYtPmlkLT5tdGRfaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBsb2NhdGUgcGFydGl0aW9uIG51bWJlciwgcmV0dXJuIGl0ICovCisJbnVtID0gMDsKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmZGV2LT5wYXJ0cykgeworCQlwYXJ0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHBhcnRfaW5mbywgbGluayk7CisKKwkJaWYgKHBhcnRfbnVtID09IG51bSsrKSB7CisJCQlyZXR1cm4gcGFydDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVS1ib290IGNvbW1hbmRzCQkJCSAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFJvdXRpbmUgaW1wbGVtZW50aW5nIGZzbG9hZCB1LWJvb3QgY29tbWFuZC4gVGhpcyByb3V0aW5lIHRyaWVzIHRvIGxvYWQKKyAqIGEgcmVxdWVzdGVkIGZpbGUgZnJvbSBqZmZzMi9jcmFtZnMgZmlsZXN5c3RlbSBvbiBhIGN1cnJlbnQgcGFydGl0aW9uLgorICoKKyAqIEBwYXJhbSBjbWR0cCBjb21tYW5kIGludGVybmFsIGRhdGEKKyAqIEBwYXJhbSBmbGFnIGNvbW1hbmQgZmxhZworICogQHBhcmFtIGFyZ2MgbnVtYmVyIG9mIGFyZ3VtZW50cyBzdXBwbGllZCB0byB0aGUgY29tbWFuZAorICogQHBhcmFtIGFyZ3YgYXJndW1lbnRzIGxpc3QKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorICovCitpbnQgZG9famZmczJfZnNsb2FkKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQorewogCWNoYXIgKmZzbmFtZTsKIAljaGFyICpmaWxlbmFtZTsKIAlpbnQgc2l6ZTsKQEAgLTE0Myw3ICsxNzc4LDExIEBACiAJCWZpbGVuYW1lID0gYXJndlsyXTsKIAl9CiAKLQlpZiAoMCAhPSAocGFydD1qZmZzMl9wYXJ0X2luZm8ocGFydF9udW0pKSl7CisJLyogbWFrZSBzdXJlIHdlIGFyZSBpbiBzeW5jIHdpdGggZW52IHZhcmlhYmxlcyAqLworCWlmIChtdGRwYXJ0c19pbml0KCkgIT0wKQorCQlyZXR1cm4gMTsKKworCWlmICgocGFydCA9IGpmZnMyX3BhcnRfaW5mbyhjdXJyZW50X2RldiwgY3VycmVudF9wYXJ0bnVtKSkpewogCiAJCS8qIGNoZWNrIHBhcnRpdGlvbiB0eXBlIGZvciBjcmFtZnMgKi8KIAkJZnNuYW1lID0gKGNyYW1mc19jaGVjayhwYXJ0KSA/ICJDUkFNRlMiIDogIkpGRlMyIik7CkBAIC0xNjgsMTUgKzE4MDcsMjEgQEAKIAogCQlyZXR1cm4gIShzaXplID4gMCk7CiAJfQotCXB1dHMgKCJBY3RpdmUgcGFydGl0aW9uIG5vdCB2YWxpZFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKLWludAotZG9famZmczJfbHMoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCisvKioKKyAqIFJvdXRpbmUgaW1wbGVtZW50aW5nIHUtYm9vdCBscyBjb21tYW5kIHdoaWNoIGxpc3RzIGNvbnRlbnQgb2YgYSBnaXZlbgorICogZGlyZWN0b3J5IG9uIGEgY3VycmVudCBwYXJ0aXRpb24uCisgKgorICogQHBhcmFtIGNtZHRwIGNvbW1hbmQgaW50ZXJuYWwgZGF0YQorICogQHBhcmFtIGZsYWcgY29tbWFuZCBmbGFnCisgKiBAcGFyYW0gYXJnYyBudW1iZXIgb2YgYXJndW1lbnRzIHN1cHBsaWVkIHRvIHRoZSBjb21tYW5kCisgKiBAcGFyYW0gYXJndiBhcmd1bWVudHMgbGlzdAorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlCisgKi8KK2ludCBkb19qZmZzMl9scyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKLQlzdHJ1Y3QgcGFydF9pbmZvKiBqZmZzMl9wYXJ0X2luZm8oaW50KTsKLQlpbnQgamZmczJfMXBhc3NfbHMoc3RydWN0IHBhcnRfaW5mbyAqLGNoYXIgKik7CiAJY2hhciAqZmlsZW5hbWUgPSAiLyI7CiAJaW50IHJldDsKIAlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OwpAQCAtMTg0LDcgKzE4MjksMTEgQEAKIAlpZiAoYXJnYyA9PSAyKQogCQlmaWxlbmFtZSA9IGFyZ3ZbMV07CiAKLQlpZiAoMCAhPSAocGFydD1qZmZzMl9wYXJ0X2luZm8ocGFydF9udW0pKSl7CisJLyogbWFrZSBzdXJlIHdlIGFyZSBpbiBzeW5jIHdpdGggZW52IHZhcmlhYmxlcyAqLworCWlmIChtdGRwYXJ0c19pbml0KCkgIT0wKQorCQlyZXR1cm4gMTsKKworCWlmICgocGFydCA9IGpmZnMyX3BhcnRfaW5mbyhjdXJyZW50X2RldiwgY3VycmVudF9wYXJ0bnVtKSkpewogCiAJCS8qIGNoZWNrIHBhcnRpdGlvbiB0eXBlIGZvciBjcmFtZnMgKi8KIAkJaWYgKGNyYW1mc19jaGVjayhwYXJ0KSkgewpAQCAtMTk2LDIwICsxODQ1LDMwIEBACiAKIAkJcmV0dXJuIChyZXQgPT0gMSk7CiAJfQotCXB1dHMgKCJBY3RpdmUgcGFydGl0aW9uIG5vdCB2YWxpZFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKLWludAotZG9famZmczJfZnNpbmZvKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQorLyoqCisgKiBSb3V0aW5lIGltcGxlbWVudGluZyB1LWJvb3QgZnNpbmZvIGNvbW1hbmQuIFRoaXMgcm91dGluZSBwcmludHMgb3V0CisgKiBtaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW0gaW5mb3JtYXRpb25zL3N0YXRpc3RpY3MuCisgKgorICogQHBhcmFtIGNtZHRwIGNvbW1hbmQgaW50ZXJuYWwgZGF0YQorICogQHBhcmFtIGZsYWcgY29tbWFuZCBmbGFnCisgKiBAcGFyYW0gYXJnYyBudW1iZXIgb2YgYXJndW1lbnRzIHN1cHBsaWVkIHRvIHRoZSBjb21tYW5kCisgKiBAcGFyYW0gYXJndiBhcmd1bWVudHMgbGlzdAorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlCisgKi8KK2ludCBkb19qZmZzMl9mc2luZm8oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7Ci0Jc3RydWN0IHBhcnRfaW5mbyogamZmczJfcGFydF9pbmZvKGludCk7Ci0JaW50IGpmZnMyXzFwYXNzX2luZm8oc3RydWN0IHBhcnRfaW5mbyAqKTsKIAlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OwogCWNoYXIgKmZzbmFtZTsKIAlpbnQgcmV0OwogCi0JaWYgKChwYXJ0PWpmZnMyX3BhcnRfaW5mbyhwYXJ0X251bSkpKXsKKwkvKiBtYWtlIHN1cmUgd2UgYXJlIGluIHN5bmMgd2l0aCBlbnYgdmFyaWFibGVzICovCisJaWYgKG10ZHBhcnRzX2luaXQoKSAhPTApCisJCXJldHVybiAxOworCQorCWlmICgocGFydCA9IGpmZnMyX3BhcnRfaW5mbyhjdXJyZW50X2RldiwgY3VycmVudF9wYXJ0bnVtKSkpewogCiAJCS8qIGNoZWNrIHBhcnRpdGlvbiB0eXBlIGZvciBjcmFtZnMgKi8KIAkJZnNuYW1lID0gKGNyYW1mc19jaGVjayhwYXJ0KSA/ICJDUkFNRlMiIDogIkpGRlMyIik7CkBAIC0yMjQsNDggKzE4ODMsMTU5IEBACiAKIAkJcmV0dXJuIChyZXQgPT0gMSk7CiAJfQotCXB1dHMgKCJBY3RpdmUgcGFydGl0aW9uIG5vdCB2YWxpZFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKLSNpZm5kZWYgQ0ZHX0pGRlNfU0lOR0xFX1BBUlQKLWludAotZG9famZmczJfY2hwYXJ0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQorLyogY29tbWFuZCBsaW5lIG9ubHkgKi8KKyNpZmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorLyoqCisgKiBSb3V0aW5lIGltcGxlbWVudGluZyB1LWJvb3QgY2hwYXJ0IGNvbW1hbmQuIFNldHMgbmV3IGN1cnJlbnQgcGFydGl0aW9uIGJhc2VkCisgKiBvbiB0aGUgdXNlciBzdXBwbGllZCBwYXJ0aXRpb24gaWQuIEZvciBwYXJ0aXRpb24gaWQgZm9ybWF0IHNlZSBmaW5kX2Rldl9hbmRfcGFydCgpLgorICoKKyAqIEBwYXJhbSBjbWR0cCBjb21tYW5kIGludGVybmFsIGRhdGEKKyAqIEBwYXJhbSBmbGFnIGNvbW1hbmQgZmxhZworICogQHBhcmFtIGFyZ2MgbnVtYmVyIG9mIGFyZ3VtZW50cyBzdXBwbGllZCB0byB0aGUgY29tbWFuZAorICogQHBhcmFtIGFyZ3YgYXJndW1lbnRzIGxpc3QKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorICovCitpbnQgZG9famZmczJfY2hwYXJ0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewotCWludCB0bXBfcGFydDsKLQljaGFyIHN0cl9wYXJ0X251bVszXTsKLQlzdHJ1Y3QgcGFydF9pbmZvKiBqZmZzMl9wYXJ0X2luZm8oaW50KTsKKy8qIGNvbW1hbmQgbGluZSBvbmx5ICovCisJc3RydWN0IG10ZF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OworCXU4IHBudW07CiAKLQlpZiAoYXJnYyA+PSAyKSB7Ci0JCXRtcF9wYXJ0ID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOwotCX0gZWxzZSB7Ci0JCXB1dHMgKCJOZWVkIHBhcnRpdGlvbiBudW1iZXIgaW4gYXJndW1lbnQgbGlzdFxuIik7Ci0JCXJldHVybiAwOworCWlmIChtdGRwYXJ0c19pbml0KCkgIT0wKQorCQlyZXR1cm4gMTsKIAorCWlmIChhcmdjIDwgMikgeworCQlwcmludGYoIm5vIHBhcnRpdGlvbiBpZCBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gMTsKIAl9CiAKLQlpZiAoamZmczJfcGFydF9pbmZvKHRtcF9wYXJ0KSl7Ci0JCXByaW50ZigiUGFydGl0aW9uIGNoYW5nZWQgdG8gJWRcbiIsdG1wX3BhcnQpOwotCQlwYXJ0X251bT10bXBfcGFydDsKLQkJc3ByaW50ZihzdHJfcGFydF9udW0sICIlZCIsIHBhcnRfbnVtKTsKLQkJc2V0ZW52KCJwYXJ0aXRpb24iLCBzdHJfcGFydF9udW0pOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKGZpbmRfZGV2X2FuZF9wYXJ0KGFyZ3ZbMV0sICZkZXYsICZwbnVtLCAmcGFydCkgIT0gMCkKKwkJcmV0dXJuIDE7CiAKLQlwcmludGYoIlBhcnRpdGlvbiAlZCBpcyBub3QgdmFsaWQgcGFydGl0b25cbiIsdG1wX3BhcnQpOworCWN1cnJlbnRfZGV2ID0gZGV2OworCWN1cnJlbnRfcGFydG51bSA9IHBudW07CisJY3VycmVudF9zYXZlKCk7CisKKwlwcmludGYoInBhcnRpdGlvbiBjaGFuZ2VkIHRvICVzJWQsJWRcbiIsCisJCQlNVERfREVWX1RZUEUoZGV2LT5pZC0+dHlwZSksIGRldi0+aWQtPm51bSwgcG51bSk7CisKIAlyZXR1cm4gMDsKLQogfQogCi1VX0JPT1RfQ01EKAotCWNocGFydCwJMiwJMCwJZG9famZmczJfY2hwYXJ0LAotCSJjaHBhcnRcdC0gY2hhbmdlIGFjdGl2ZSBwYXJ0aXRpb25cbiIsCi0JIiAgICAtIGNoYW5nZSBhY3RpdmUgcGFydGl0aW9uXG4iCi0pOwotI2VuZGlmCS8qIENGR19KRkZTX1NJTkdMRV9QQVJUICovCisvKioKKyAqIFJvdXRpbmUgaW1wbGVtZW50aW5nIHUtYm9vdCBtdGRwYXJ0cyBjb21tYW5kLiBJbml0aWFsaXplL3VwZGF0ZSBkZWZhdWx0IGdsb2JhbAorICogcGFydGl0aW9uIGxpc3QgYW5kIHByb2Nlc3MgdXNlciBwYXJ0aXRpb24gcmVxdWVzdCAobGlzdCwgYWRkLCBkZWwpLgorICoKKyAqIEBwYXJhbSBjbWR0cCBjb21tYW5kIGludGVybmFsIGRhdGEKKyAqIEBwYXJhbSBmbGFnIGNvbW1hbmQgZmxhZworICogQHBhcmFtIGFyZ2MgbnVtYmVyIG9mIGFyZ3VtZW50cyBzdXBwbGllZCB0byB0aGUgY29tbWFuZAorICogQHBhcmFtIGFyZ3YgYXJndW1lbnRzIGxpc3QKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG90aGVyd2lzZQorICovCitpbnQgZG9famZmczJfbXRkcGFydHMoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaWYgKGFyZ2MgPT0gMikgeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJkZWZhdWx0IikgPT0gMCkgeworCQkJc2V0ZW52KCJtdGRpZHMiLCAoY2hhciAqKW10ZGlkc19kZWZhdWx0KTsKKwkJCXNldGVudigibXRkcGFydHMiLCAoY2hhciAqKW10ZHBhcnRzX2RlZmF1bHQpOworCQkJc2V0ZW52KCJwYXJ0aXRpb24iLCBOVUxMKTsKKworCQkJbXRkcGFydHNfaW5pdCgpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJkZWxhbGwiKSA9PSAwKSB7CisJCQkvKiB0aGlzIG1heSBiZSB0aGUgZmlyc3QgcnVuLCBpbml0aWFsaXplIGxpc3RzIGlmIG5lZWRlZCAqLworCQkJbXRkcGFydHNfaW5pdCgpOworCisJCQlzZXRlbnYoIm10ZHBhcnRzIiwgTlVMTCk7CisKKwkJCS8qIGRldmljZXNfaW5pdCgpIGNhbGxzIGN1cnJlbnRfc2F2ZSgpICovCisJCQlyZXR1cm4gZGV2aWNlc19pbml0KCk7CisJCX0KKwl9CisKKwkvKiBtYWtlIHN1cmUgd2UgYXJlIGluIHN5bmMgd2l0aCBlbnYgdmFyaWFibGVzICovCisJaWYgKG10ZHBhcnRzX2luaXQoKSAhPSAwKQorCQlyZXR1cm4gMTsKKworCWlmIChhcmdjID09IDEpIHsKKwkJbGlzdF9wYXJ0aXRpb25zKCk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBtdGRwYXJ0cyBhZGQgPG10ZC1kZXY+IDxzaXplPltAPG9mZnNldD5dIDxuYW1lPiBbcm9dICovCisJaWYgKCgoYXJnYyA9PSA1KSB8fCAoYXJnYyA9PSA2KSkgJiYgKHN0cmNtcChhcmd2WzFdLCAiYWRkIikgPT0gMCkpIHsKKyNkZWZpbmUgUEFSVF9BRERfREVTQ19NQVhMRU4gNjQKKwkJY2hhciB0bXBidWZbUEFSVF9BRERfREVTQ19NQVhMRU5dOworCQl1OCB0eXBlLCBudW0sIGxlbjsKKwkJc3RydWN0IG10ZF9kZXZpY2UgKmRldjsKKwkJc3RydWN0IG10ZF9kZXZpY2UgKmRldl90bXA7CisJCXN0cnVjdCBtdGRpZHMgKmlkOworCQlzdHJ1Y3QgcGFydF9pbmZvICpwOworCisJCWlmIChpZF9wYXJzZShhcmd2WzJdLCBOVUxMLCAmdHlwZSwgJm51bSkgIT0gMCkKKwkJCXJldHVybiAxOworCisJCWlmICgoaWQgPSBpZF9maW5kKHR5cGUsIG51bSkpID09IE5VTEwpIHsKKwkJCXByaW50Zigibm8gc3VjaCBkZXZpY2UgJXMgZGVmaW5lZCBpbiBtdGRpZHMgdmFyaWFibGVcbiIsIGFyZ3ZbMl0pOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlsZW4gPSBzdHJsZW4oaWQtPm10ZF9pZCkgKyAxOwkvKiAnbXRkX2lkOicgKi8KKwkJbGVuICs9IHN0cmxlbihhcmd2WzNdKTsJCS8qIHNpemVAb2Zmc2V0ICovCisJCWxlbiArPSBzdHJsZW4oYXJndls0XSkgKyAyOwkvKiAnKCcgbmFtZSAnKScgKi8KKwkJaWYgKGFyZ3ZbNV0gJiYgKHN0cmxlbihhcmd2WzVdKSA9PSAyKSkKKwkJCWxlbiArPSAyOwkJLyogJ3JvJyAqLworCisJCWlmIChsZW4gPj0gUEFSVF9BRERfREVTQ19NQVhMRU4pIHsKKwkJCXByaW50ZigidG9vIGxvbmcgcGFydGl0aW9uIGRlc2NyaXB0aW9uXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNwcmludGYodG1wYnVmLCAiJXM6JXMoJXMpJXMiLAorCQkJCWlkLT5tdGRfaWQsIGFyZ3ZbM10sIGFyZ3ZbNF0sIGFyZ3ZbNV0gPyBhcmd2WzVdIDogIiIpOyAKKwkJREVCVUdGKCJhZGQgdG1wYnVmOiAlc1xuIiwgdG1wYnVmKTsKKworCQlpZiAoKGRldmljZV9wYXJzZSh0bXBidWYsIE5VTEwsICZkZXYpICE9IDApIHx8ICghZGV2KSkKKwkJCXJldHVybiAxOworCisJCURFQlVHRigiKyAlc1x0JWRcdCVzXG4iLCBNVERfREVWX1RZUEUoZGV2LT5pZC0+dHlwZSksCisJCQkJZGV2LT5pZC0+bnVtLCBkZXYtPmlkLT5tdGRfaWQpOworCisJCWlmICgoZGV2X3RtcCA9IGRldmljZV9maW5kKGRldi0+aWQtPnR5cGUsIGRldi0+aWQtPm51bSkpID09IE5VTEwpIHsKKwkJCWRldmljZV9hZGQoZGV2KTsKKwkJfSBlbHNlIHsKKwkJCS8qIG1lcmdlIG5ldyBwYXJ0aXRpb24gd2l0aCBleGlzdGluZyBvbmVzKi8KKwkJCXAgPSBsaXN0X2VudHJ5KGRldi0+cGFydHMubmV4dCwgc3RydWN0IHBhcnRfaW5mbywgbGluayk7CisJCQlpZiAocGFydF9hZGQoZGV2X3RtcCwgcCkgIT0gMCkgeworCQkJCWRldmljZV9kZWwoZGV2KTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCisJCWlmIChnZW5lcmF0ZV9tdGRwYXJ0c19zYXZlKGxhc3RfcGFydHMsIE1URFBBUlRTX01BWExFTikgIT0gMCkgeworCQkJcHJpbnRmKCJnZW5lcmF0ZWQgbXRkcGFydHMgdG9vIGxvbmcsIHJlc2V0aW5nIHRvIG51bGxcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBtdGRwYXJ0cyBkZWwgcGFydC1pZCAqLworCWlmICgoYXJnYyA9PSAzKSAmJiAoc3RyY21wKGFyZ3ZbMV0sICJkZWwiKSA9PSAwKSkgeworCQlERUJVR0YoImRlbDogcGFydC1pZCA9ICVzXG4iLCBhcmd2WzJdKTsKKworCQlyZXR1cm4gZGVsZXRlX3BhcnRpdGlvbihhcmd2WzJdKTsKKwl9CisKKwlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworfQorI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSkZGUzJfQ01ETElORSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBVX0JPT1RfQ01EKAogCWZzbG9hZCwJMywJMCwJZG9famZmczJfZnNsb2FkLAogCSJmc2xvYWRcdC0gbG9hZCBiaW5hcnkgZmlsZSBmcm9tIGEgZmlsZXN5c3RlbSBpbWFnZVxuIiwKQEAgLTI3Myw2ICsyMDQzLDEyIEBACiAJIiAgICAtIGxvYWQgYmluYXJ5IGZpbGUgZnJvbSBmbGFzaCBiYW5rXG4iCiAJIiAgICAgIHdpdGggb2Zmc2V0ICdvZmYnXG4iCiApOworVV9CT09UX0NNRCgKKwlscywJMiwJMSwJZG9famZmczJfbHMsCisJImxzXHQtIGxpc3QgZmlsZXMgaW4gYSBkaXJlY3RvcnkgKGRlZmF1bHQgLylcbiIsCisJIlsgZGlyZWN0b3J5IF1cbiIKKwkiICAgIC0gbGlzdCBmaWxlcyBpbiBhIGRpcmVjdG9yeS5cbiIKKyk7CiAKIFVfQk9PVF9DTUQoCiAJZnNpbmZvLAkxLAkxLAlkb19qZmZzMl9mc2luZm8sCkBAIC0yODAsMTEgKzIwNTYsNTAgQEAKIAkiICAgIC0gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgZmlsZXN5c3RlbXNcbiIKICk7CiAKKyNpZmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQogVV9CT09UX0NNRCgKLQlscywJMiwJMSwJZG9famZmczJfbHMsCi0JImxzXHQtIGxpc3QgZmlsZXMgaW4gYSBkaXJlY3RvcnkgKGRlZmF1bHQgLylcbiIsCi0JIlsgZGlyZWN0b3J5IF1cbiIKLQkiICAgIC0gbGlzdCBmaWxlcyBpbiBhIGRpcmVjdG9yeS5cbiIKKwljaHBhcnQsCTIsCTAsCWRvX2pmZnMyX2NocGFydCwKKwkiY2hwYXJ0XHQtIGNoYW5nZSBhY3RpdmUgcGFydGl0aW9uXG4iLAorCSJwYXJ0LWlkXG4iCisJIiAgICAtIGNoYW5nZSBhY3RpdmUgcGFydGl0aW9uIChlLmcuIHBhcnQtaWQgPSBuYW5kMCwxKVxuIgogKTsKIAorVV9CT09UX0NNRCgKKwltdGRwYXJ0cywJNiwJMCwJZG9famZmczJfbXRkcGFydHMsCisJIm10ZHBhcnRzLSBkZWZpbmUgZmxhc2gvbmFuZCBwYXJ0aXRpb25zXG4iLAorCSJcbiIKKwkiICAgIC0gbGlzdCBwYXJ0aXRpb24gdGFibGVcbiIKKwkibXRkcGFydHMgZGVsYWxsXG4iCisJIiAgICAtIGRlbGV0ZSBhbGwgcGFydGl0aW9uc1xuIgorCSJtdGRwYXJ0cyBkZWwgcGFydC1pZFxuIgorCSIgICAgLSBkZWxldGUgcGFydGl0aW9uIChlLmcuIHBhcnQtaWQgPSBuYW5kMCwxKVxuIgorCSJtdGRwYXJ0cyBhZGQgPG10ZC1kZXY+IDxzaXplPltAPG9mZnNldD5dIFs8bmFtZT5dIFtyb11cbiIKKwkiICAgIC0gYWRkIHBhcnRpdGlvblxuIgorCSJtdGRwYXJ0cyBkZWZhdWx0XG4iCisJIiAgICAtIHJlc2V0IHBhcnRpdGlvbiB0YWJsZSB0byBkZWZhdWx0c1xuXG4iCisJIi0tLS0tXG5cbiIKKwkidGhpcyBjb21tYW5kIHVzZXMgdGhyZWUgZW52aXJvbm1lbnQgdmFyaWFibGVzOlxuXG4iCisJIidwYXJ0aXRpb24nIC0ga2VlcHMgY3VycmVudCBwYXJ0aXRpb24gaWRlbnRpZmllclxuXG4iCisJInBhcnRpdGlvbiAgOj0gPHBhcnQtaWQ+XG4iCisJIjxwYXJ0LWlkPiAgOj0gPGRldi1pZD4scGFydF9udW1cblxuIgorCSInbXRkaWRzJyAtIGxpbnV4IGtlcm5lbCBtdGQgZGV2aWNlIGlkIDwtPiB1LWJvb3QgZGV2aWNlIGlkIG1hcHBpbmdcblxuIgorCSJtdGRpZHM9PGlkbWFwPlssPGlkbWFwPiwuLi5dXG5cbiIKKwkiPGlkbWFwPiAgICA6PSA8ZGV2LWlkPj08bXRkLWlkPlxuIgorCSI8ZGV2LWlkPiAgIDo9ICduYW5kJ3wnbm9yJzxkZXYtbnVtPlxuIgorCSI8ZGV2LW51bT4gIDo9IG10ZCBkZXZpY2UgbnVtYmVyLCAwLi4uXG4iCisJIjxtdGQtaWQ+ICAgOj0gdW5pcXVlIGRldmljZSB0YWcgdXNlZCBieSBsaW51eCBrZXJuZWwgdG8gZmluZCBtdGQgZGV2aWNlIChtdGQtPm5hbWUpXG5cbiIKKwkiJ210ZHBhcnRzJyAtIHBhcnRpdGlvbiBsaXN0XG5cbiIKKwkibXRkcGFydHM9bXRkcGFydHM9PG10ZC1kZWY+Wzs8bXRkLWRlZj4uLi5dXG5cbiIKKwkiPG10ZC1kZWY+ICA6PSA8bXRkLWlkPjo8cGFydC1kZWY+Wyw8cGFydC1kZWY+Li4uXVxuIgorCSI8bXRkLWlkPiAgIDo9IHVuaXF1ZSBkZXZpY2UgdGFnIHVzZWQgYnkgbGludXgga2VybmVsIHRvIGZpbmQgbXRkIGRldmljZSAobXRkLT5uYW1lKVxuIgorCSI8cGFydC1kZWY+IDo9IDxzaXplPltAPG9mZnNldD5dWzxuYW1lPl1bPHJvLWZsYWc+XVxuIgorCSI8c2l6ZT4gICAgIDo9IHN0YW5kYXJkIGxpbnV4IG1lbXNpemUgT1IgJy0nIHRvIGRlbm90ZSBhbGwgcmVtYWluaW5nIHNwYWNlXG4iCisJIjxvZmZzZXQ+ICAgOj0gcGFydGl0aW9uIHN0YXJ0IG9mZnNldCB3aXRoaW4gdGhlIGRldmljZVxuIgorCSI8bmFtZT4gICAgIDo9ICcoJyBOQU1FICcpJ1xuIgorCSI8cm8tZmxhZz4gIDo9IHdoZW4gc2V0IHRvICdybycgbWFrZXMgcGFydGl0aW9uIHJlYWQtb25seSAobm90IHVzZWQsIHBhc3NlZCB0byBrZXJuZWwpXG4iCispOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSkZGUzJfQ01ETElORSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLwpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL2NyYW1mcy5jIGIvZnMvY3JhbWZzL2NyYW1mcy5jCmluZGV4IDk4ZmY1NjcuLmYwMmJmM2MgMTAwNjQ0Ci0tLSBhL2ZzL2NyYW1mcy9jcmFtZnMuYworKysgYi9mcy9jcmFtZnMvY3JhbWZzLmMKQEAgLTQyLDE3ICs0MiwyMiBAQAogCiBzdHJ1Y3QgY3JhbWZzX3N1cGVyIHN1cGVyOwogCisvKiBDUFUgYWRkcmVzcyBzcGFjZSBvZmZzZXQgY2FsY3VsYXRpb24gbWFjcm8sIHN0cnVjdCBwYXJ0X2luZm8gb2Zmc2V0IGlzCisgKiBkZXZpY2UgYWRkcmVzcyBzcGFjZSBvZmZzZXQsIHNvIHdlIG5lZWQgdG8gc2hpZnQgaXQgYnkgYSBkZXZpY2Ugc3RhcnQgYWRkcmVzcy4gKi8KK2V4dGVybiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsKKyNkZWZpbmUgUEFSVF9PRkZTRVQoeCkJKHgtPm9mZnNldCArIGZsYXNoX2luZm9beC0+ZGV2LT5pZC0+bnVtXS5zdGFydFswXSkKKwogc3RhdGljIGludCBjcmFtZnNfcmVhZF9zdXBlciAoc3RydWN0IHBhcnRfaW5mbyAqaW5mbykKIHsKIAl1bnNpZ25lZCBsb25nIHJvb3Rfb2Zmc2V0OwogCiAJLyogUmVhZCB0aGUgZmlyc3QgYmxvY2sgYW5kIGdldCB0aGUgc3VwZXJibG9jayBmcm9tIGl0ICovCi0JbWVtY3B5ICgmc3VwZXIsICh2b2lkICopIGluZm8tPm9mZnNldCwgc2l6ZW9mIChzdXBlcikpOworCW1lbWNweSAoJnN1cGVyLCAodm9pZCAqKSBQQVJUX09GRlNFVChpbmZvKSwgc2l6ZW9mIChzdXBlcikpOwogCiAJLyogRG8gc2FuaXR5IGNoZWNrcyBvbiB0aGUgc3VwZXJibG9jayAqLwogCWlmIChzdXBlci5tYWdpYyAhPSBDUkFNRlNfMzIgKENSQU1GU19NQUdJQykpIHsKIAkJLyogY2hlY2sgYXQgNTEyIGJ5dGUgb2Zmc2V0ICovCi0JCW1lbWNweSAoJnN1cGVyLCAodm9pZCAqKSBpbmZvLT5vZmZzZXQgKyA1MTIsIHNpemVvZiAoc3VwZXIpKTsKKwkJbWVtY3B5ICgmc3VwZXIsICh2b2lkICopIFBBUlRfT0ZGU0VUKGluZm8pICsgNTEyLCBzaXplb2YgKHN1cGVyKSk7CiAJCWlmIChzdXBlci5tYWdpYyAhPSBDUkFNRlNfMzIgKENSQU1GU19NQUdJQykpIHsKIAkJCXByaW50ZiAoImNyYW1mczogd3JvbmcgbWFnaWNcbiIpOwogCQkJcmV0dXJuIC0xOwpAQCAtODcsNyArOTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjcmFtZnNfcmVzb2x2ZSAoY2hhciAqYmVnaW4sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorc3RhdGljIHVuc2lnbmVkIGxvbmcgY3JhbWZzX3Jlc29sdmUgKHVuc2lnbmVkIGxvbmcgYmVnaW4sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgcmF3LAogCQkJCSAgICAgY2hhciAqZmlsZW5hbWUpCiB7CkBAIC0xNTAsNyArMTU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjcmFtZnNfdW5jb21wcmVzcyAoY2hhciAqYmVnaW4sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorc3RhdGljIGludCBjcmFtZnNfdW5jb21wcmVzcyAodW5zaWduZWQgbG9uZyBiZWdpbiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvYWRvZmZzZXQpCiB7CiAJc3RydWN0IGNyYW1mc19pbm9kZSAqaW5vZGUgPSAoc3RydWN0IGNyYW1mc19pbm9kZSAqKSAoYmVnaW4gKyBvZmZzZXQpOwpAQCAtMTg3LDcgKzE5Miw3IEBACiAJaWYgKGNyYW1mc19yZWFkX3N1cGVyIChpbmZvKSkKIAkJcmV0dXJuIC0xOwogCi0Jb2Zmc2V0ID0gY3JhbWZzX3Jlc29sdmUgKGluZm8tPm9mZnNldCwKKwlvZmZzZXQgPSBjcmFtZnNfcmVzb2x2ZSAoUEFSVF9PRkZTRVQoaW5mbyksCiAJCQkJIENSQU1GU19HRVRfT0ZGU0VUICgmKHN1cGVyLnJvb3QpKSA8PCAyLAogCQkJCSBDUkFNRlNfMjQgKHN1cGVyLnJvb3Quc2l6ZSksIDAsCiAJCQkJIHN0cnRvayAoZmlsZW5hbWUsICIvIikpOwpAQCAtMTk1LDE0ICsyMDAsMTQgQEAKIAlpZiAob2Zmc2V0IDw9IDApCiAJCXJldHVybiBvZmZzZXQ7CiAKLQlyZXR1cm4gY3JhbWZzX3VuY29tcHJlc3MgKGluZm8tPm9mZnNldCwgb2Zmc2V0LAorCXJldHVybiBjcmFtZnNfdW5jb21wcmVzcyAoUEFSVF9PRkZTRVQoaW5mbyksIG9mZnNldCwKIAkJCQkgICh1bnNpZ25lZCBsb25nKSBsb2Fkb2Zmc2V0KTsKIH0KIAogc3RhdGljIGludCBjcmFtZnNfbGlzdF9pbm9kZSAoc3RydWN0IHBhcnRfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7CiAJc3RydWN0IGNyYW1mc19pbm9kZSAqaW5vZGUgPSAoc3RydWN0IGNyYW1mc19pbm9kZSAqKQotCQkoaW5mby0+b2Zmc2V0ICsgb2Zmc2V0KTsKKwkJKFBBUlRfT0ZGU0VUKGluZm8pICsgb2Zmc2V0KTsKIAljaGFyICpuYW1lLCBzdHJbMjBdOwogCWludCBuYW1lbGVuLCBuZXh0b2ZmOwogCkBAIC0yMzMsNyArMjM4LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBzaXplID0gQ1JBTUZTXzI0IChpbm9kZS0+c2l6ZSk7CiAJCWNoYXIgKmxpbmsgPSBtYWxsb2MgKHNpemUpOwogCi0JCWlmIChsaW5rICE9IE5VTEwgJiYgY3JhbWZzX3VuY29tcHJlc3MgKGluZm8tPm9mZnNldCwgb2Zmc2V0LAorCQlpZiAobGluayAhPSBOVUxMICYmIGNyYW1mc191bmNvbXByZXNzIChQQVJUX09GRlNFVChpbmZvKSwgb2Zmc2V0LAogCQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBsaW5rKQogCQkgICAgPT0gc2l6ZSkKIAkJCXByaW50ZiAoIiAtPiAlKi4qc1xuIiwgKGludCkgc2l6ZSwgKGludCkgc2l6ZSwgbGluayk7CkBAIC0yNjIsNyArMjY3LDcgQEAKIAkJc2l6ZSA9IENSQU1GU18yNCAoc3VwZXIucm9vdC5zaXplKTsKIAl9IGVsc2UgewogCQkvKiBSZXNvbHZlIHRoZSBwYXRoICovCi0JCW9mZnNldCA9IGNyYW1mc19yZXNvbHZlIChpbmZvLT5vZmZzZXQsCisJCW9mZnNldCA9IGNyYW1mc19yZXNvbHZlIChQQVJUX09GRlNFVChpbmZvKSwKIAkJCQkJIENSQU1GU19HRVRfT0ZGU0VUICgmKHN1cGVyLnJvb3QpKSA8PAogCQkJCQkgMiwgQ1JBTUZTXzI0IChzdXBlci5yb290LnNpemUpLCAxLAogCQkJCQkgc3RydG9rIChmaWxlbmFtZSwgIi8iKSk7CkBAIC0yNzEsNyArMjc2LDcgQEAKIAkJCXJldHVybiBvZmZzZXQ7CiAKIAkJLyogUmVzb2x2aW5nIHdhcyBzdWNjZXNzZnVsLiBFeGFtaW5lIHRoZSBpbm9kZSAqLwotCQlpbm9kZSA9IChzdHJ1Y3QgY3JhbWZzX2lub2RlICopIChpbmZvLT5vZmZzZXQgKyBvZmZzZXQpOworCQlpbm9kZSA9IChzdHJ1Y3QgY3JhbWZzX2lub2RlICopIChQQVJUX09GRlNFVChpbmZvKSArIG9mZnNldCk7CiAJCWlmICghU19JU0RJUiAoQ1JBTUZTXzE2IChpbm9kZS0+bW9kZSkpKSB7CiAJCQkvKiBJdCdzIG5vdCBhIGRpcmVjdG9yeSAtIGxpc3QgaXQsIGFuZCB0aGF0J3MgdGhhdCAqLwogCQkJcmV0dXJuIChjcmFtZnNfbGlzdF9pbm9kZSAoaW5mbywgb2Zmc2V0KSA+IDApOwpAQCAtMjg0LDcgKzI4OSw3IEBACiAKIAkvKiBMaXN0IHRoZSBnaXZlbiBkaXJlY3RvcnkgKi8KIAl3aGlsZSAoaW5vZGVvZmZzZXQgPCBzaXplKSB7Ci0JCWlub2RlID0gKHN0cnVjdCBjcmFtZnNfaW5vZGUgKikgKGluZm8tPm9mZnNldCArIG9mZnNldCArCisJCWlub2RlID0gKHN0cnVjdCBjcmFtZnNfaW5vZGUgKikgKFBBUlRfT0ZGU0VUKGluZm8pICsgb2Zmc2V0ICsKIAkJCQkJCSBpbm9kZW9mZnNldCk7CiAKIAkJbmV4dG9mZnNldCA9IGNyYW1mc19saXN0X2lub2RlIChpbmZvLCBvZmZzZXQgKyBpbm9kZW9mZnNldCk7CkBAIC0zMjQsMTQgKzMyOSwxNyBAQAogCiBpbnQgY3JhbWZzX2NoZWNrIChzdHJ1Y3QgcGFydF9pbmZvICppbmZvKQogewotCXN0cnVjdCBjcmFtZnNfc3VwZXIgKnNiID0gKHN0cnVjdCBjcmFtZnNfc3VwZXIgKikgaW5mby0+b2Zmc2V0OworCXN0cnVjdCBjcmFtZnNfc3VwZXIgKnNiOwogCisJaWYgKGluZm8tPmRldi0+aWQtPnR5cGUgIT0gTVREX0RFVl9UWVBFX05PUikKKwkJcmV0dXJuIDA7CisKKwlzYiA9IChzdHJ1Y3QgY3JhbWZzX3N1cGVyICopIFBBUlRfT0ZGU0VUKGluZm8pOwogCWlmIChzYi0+bWFnaWMgIT0gQ1JBTUZTXzMyIChDUkFNRlNfTUFHSUMpKSB7CiAJCS8qIGNoZWNrIGF0IDUxMiBieXRlIG9mZnNldCAqLwotCQlzYiA9IChzdHJ1Y3QgY3JhbWZzX3N1cGVyICopIChpbmZvLT5vZmZzZXQgKyA1MTIpOwotCQlpZiAoc2ItPm1hZ2ljICE9IENSQU1GU18zMiAoQ1JBTUZTX01BR0lDKSkgeworCQlzYiA9IChzdHJ1Y3QgY3JhbWZzX3N1cGVyICopIChQQVJUX09GRlNFVChpbmZvKSArIDUxMik7CisJCWlmIChzYi0+bWFnaWMgIT0gQ1JBTUZTXzMyIChDUkFNRlNfTUFHSUMpKQogCQkJcmV0dXJuIDA7Ci0JCX0KIAl9CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9qZmZzMl8xcGFzcy5jIGIvZnMvamZmczIvamZmczJfMXBhc3MuYwppbmRleCBjMzU1M2NiLi41MTgwMTA3IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9qZmZzMl8xcGFzcy5jCisrKyBiL2ZzL2pmZnMyL2pmZnMyXzFwYXNzLmMKQEAgLTE0MCw4ICsxNDAsMTAgQEAKICMgZGVmaW5lIERFQlVHRihmbXQsYXJncy4uLikKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKy8qIGtlZXBzIHBvaW50ZXIgdG8gY3VycmVudGx1IHByb2Nlc3NlZCBwYXJ0aXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgcGFydF9pbmZvICpjdXJyZW50X3BhcnQ7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQogLyoKICAqIFN1cHBvcnQgZm9yIGpmZnMyIG9uIHRvcCBvZiBOQU5ELWZsYXNoCiAgKgpAQCAtMTY3LDEwICsxNjksMTAgQEAKIAogc3RhdGljIHU4KiBuYW5kX2NhY2hlID0gTlVMTDsKIHN0YXRpYyB1MzIgbmFuZF9jYWNoZV9vZmYgPSAodTMyKS0xOwotc3RhdGljIGludCBuYW5kZGV2ID0gMDsgLyogbmFuZCBkZXZpY2Ugb2YgY3VycmVudCBwYXJ0aXRpb24gKi8KIAogc3RhdGljIGludCByZWFkX25hbmRfY2FjaGVkKHUzMiBvZmYsIHUzMiBzaXplLCB1X2NoYXIgKmJ1ZikKIHsKKwlzdHJ1Y3QgbXRkaWRzICppZCA9IGN1cnJlbnRfcGFydC0+ZGV2LT5pZDsKIAl1MzIgYnl0ZXNfcmVhZCA9IDA7CiAJc2l6ZV90IHJldGxlbjsKIAlpbnQgY3B5X2J5dGVzOwpAQCAtMTkwLDEwICsxOTIsMTAgQEAKIAkJCQl9CiAJCQl9CiAJCQlpZiAocmVhZF9qZmZzMl9uYW5kKG5hbmRfY2FjaGVfb2ZmLCBOQU5EX0NBQ0hFX1NJWkUsCi0JCQkJCSAgICAmcmV0bGVuLCBuYW5kX2NhY2hlLCBuYW5kZGV2KSA8IDAgfHwKLQkJCSAgICByZXRsZW4gIT0gTkFORF9DQUNIRV9TSVpFKSB7CisJCQkJCQkmcmV0bGVuLCBuYW5kX2NhY2hlLCBpZC0+bnVtKSA8IDAgfHwKKwkJCQkJcmV0bGVuICE9IE5BTkRfQ0FDSEVfU0laRSkgewogCQkJCXByaW50ZigicmVhZF9uYW5kX2NhY2hlZDogZXJyb3IgcmVhZGluZyBuYW5kIG9mZiAlI3ggc2l6ZSAlZCBieXRlc1xuIiwKLQkJCQkgICAgICAgbmFuZF9jYWNoZV9vZmYsIE5BTkRfQ0FDSEVfU0laRSk7CisJCQkJCQluYW5kX2NhY2hlX29mZiwgTkFORF9DQUNIRV9TSVpFKTsKIAkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCX0KQEAgLTIwOCwxMiArMjEwLDEyIEBACiAJcmV0dXJuIGJ5dGVzX3JlYWQ7CiB9CiAKLXN0YXRpYyB2b2lkICpnZXRfZmxfbWVtKHUzMiBvZmYsIHUzMiBzaXplLCB2b2lkICpleHRfYnVmKQorc3RhdGljIHZvaWQgKmdldF9mbF9tZW1fbmFuZCh1MzIgb2ZmLCB1MzIgc2l6ZSwgdm9pZCAqZXh0X2J1ZikKIHsKIAl1X2NoYXIgKmJ1ZiA9IGV4dF9idWYgPyAodV9jaGFyKilleHRfYnVmIDogKHVfY2hhciopbWFsbG9jKHNpemUpOwogCiAJaWYgKE5VTEwgPT0gYnVmKSB7Ci0JCXByaW50ZigiZ2V0X2ZsX21lbTogY2FuJ3QgYWxsb2MgJWQgYnl0ZXNcbiIsIHNpemUpOworCQlwcmludGYoImdldF9mbF9tZW1fbmFuZDogY2FuJ3QgYWxsb2MgJWQgYnl0ZXNcbiIsIHNpemUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJaWYgKHJlYWRfbmFuZF9jYWNoZWQob2ZmLCBzaXplLCBidWYpIDwgMCkgewpAQCAtMjI1LDE1ICsyMjcsMTUgQEAKIAlyZXR1cm4gYnVmOwogfQogCi1zdGF0aWMgdm9pZCAqZ2V0X25vZGVfbWVtKHUzMiBvZmYpCitzdGF0aWMgdm9pZCAqZ2V0X25vZGVfbWVtX25hbmQodTMyIG9mZikKIHsKIAlzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlIG5vZGU7CiAJdm9pZCAqcmV0ID0gTlVMTDsKIAotCWlmIChOVUxMID09IGdldF9mbF9tZW0ob2ZmLCBzaXplb2Yobm9kZSksICZub2RlKSkKKwlpZiAoTlVMTCA9PSBnZXRfZmxfbWVtX25hbmQob2ZmLCBzaXplb2Yobm9kZSksICZub2RlKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoIShyZXQgPSBnZXRfZmxfbWVtKG9mZiwgbm9kZS5tYWdpYyA9PQorCWlmICghKHJldCA9IGdldF9mbF9tZW1fbmFuZChvZmYsIG5vZGUubWFnaWMgPT0KIAkJCSAgICAgICBKRkZTMl9NQUdJQ19CSVRNQVNLID8gbm9kZS50b3RsZW4gOiBzaXplb2Yobm9kZSksCiAJCQkgICAgICAgTlVMTCkpKSB7CiAJCXByaW50Zigib2ZmID0gJSN4IG1hZ2ljICUjeCB0eXBlICUjeCBub2RlLnRvdGxlbiA9ICVkXG4iLApAQCAtMjQyLDMwICsyNDQsODkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBwdXRfZmxfbWVtKHZvaWQgKmJ1ZikKK3N0YXRpYyB2b2lkIHB1dF9mbF9tZW1fbmFuZCh2b2lkICpidWYpCiB7CiAJZnJlZShidWYpOwogfQorI2VuZGlmIC8qICNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLwogCi0jZWxzZSAvKiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLwogCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisvKgorICogU3VwcG9ydCBmb3IgamZmczIgb24gdG9wIG9mIE5PUi1mbGFzaAorICoKKyAqIE5PUiBmbGFzaCBtZW1vcnkgaXMgbWFwcGVkIGluIHByb2Nlc3NvcidzIGFkZHJlc3Mgc3BhY2UsCisgKiBqdXN0IHJldHVybiBhZGRyZXNzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmdldF9mbF9tZW1fbm9yKHUzMiBvZmYpCit7CisJdTMyIGFkZHIgPSBvZmY7CisJc3RydWN0IG10ZGlkcyAqaWQgPSBjdXJyZW50X3BhcnQtPmRldi0+aWQ7CisKKwlleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisJZmxhc2hfaW5mb190ICpmbGFzaCA9ICZmbGFzaF9pbmZvW2lkLT5udW1dOworCisJYWRkciArPSBmbGFzaC0+c3RhcnRbMF07CisJcmV0dXJuICh2b2lkKilhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmdldF9ub2RlX21lbV9ub3IodTMyIG9mZikKK3sKKwlyZXR1cm4gKHZvaWQqKWdldF9mbF9tZW1fbm9yKG9mZik7Cit9CisjZW5kaWYgLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKSAqLworCisKKy8qCisgKiBHZW5lcmljIGpmZnMyIHJhdyBtZW1vcnkgYW5kIG5vZGUgcmVhZCByb3V0aW5lcy4gCisgKgorICovCiBzdGF0aWMgaW5saW5lIHZvaWQgKmdldF9mbF9tZW0odTMyIG9mZiwgdTMyIHNpemUsIHZvaWQgKmV4dF9idWYpCiB7CisJc3RydWN0IG10ZGlkcyAqaWQgPSBjdXJyZW50X3BhcnQtPmRldi0+aWQ7CisJCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisJaWYgKGlkLT50eXBlID09IE1URF9ERVZfVFlQRV9OT1IpCisJCXJldHVybiBnZXRfZmxfbWVtX25vcihvZmYpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorCWlmIChpZC0+dHlwZSA9PSBNVERfREVWX1RZUEVfTkFORCkKKwkJcmV0dXJuIGdldF9mbF9tZW1fbmFuZChvZmYsIHNpemUsIGV4dF9idWYpOworI2VuZGlmCisKKwlwcmludGYoImdldF9mbF9tZW06IHVua25vd24gZGV2aWNlIHR5cGUsIHVzaW5nIHJhdyBvZmZzZXQhXG4iKTsKIAlyZXR1cm4gKHZvaWQqKW9mZjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICpnZXRfbm9kZV9tZW0odTMyIG9mZikKIHsKKwlzdHJ1Y3QgbXRkaWRzICppZCA9IGN1cnJlbnRfcGFydC0+ZGV2LT5pZDsKKwkKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GTEFTSCkKKwlpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05PUikKKwkJcmV0dXJuIGdldF9ub2RlX21lbV9ub3Iob2ZmKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKwlpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05BTkQpCisJCXJldHVybiBnZXRfbm9kZV9tZW1fbmFuZChvZmYpOworI2VuZGlmCisKKwlwcmludGYoImdldF9ub2RlX21lbTogdW5rbm93biBkZXZpY2UgdHlwZSwgdXNpbmcgcmF3IG9mZnNldCFcbiIpOwogCXJldHVybiAodm9pZCopb2ZmOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2ZsX21lbSh2b2lkICpidWYpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKwlzdHJ1Y3QgbXRkaWRzICppZCA9IGN1cnJlbnRfcGFydC0+ZGV2LT5pZDsKKworCWlmIChpZC0+dHlwZSA9PSBNVERfREVWX1RZUEVfTkFORCkKKwkJcmV0dXJuIHB1dF9mbF9tZW1fbmFuZChidWYpOworI2VuZGlmCiB9CiAKLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLwotCi0KIC8qIENvbXByZXNzaW9uIG5hbWVzICovCiBzdGF0aWMgY2hhciAqY29tcHJfbmFtZXNbXSA9IHsKIAkiTk9ORSIsCkBAIC00NTcsOCArNTE4LDggQEAKIHN0YXRpYyB1MzIKIGpmZnMyX3NjYW5fZW1wdHkodTMyIHN0YXJ0X29mZnNldCwgc3RydWN0IHBhcnRfaW5mbyAqcGFydCkKIHsKLQljaGFyICptYXggPSBwYXJ0LT5vZmZzZXQgKyBwYXJ0LT5zaXplIC0gc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUpOwotCWNoYXIgKm9mZnNldCA9IHBhcnQtPm9mZnNldCArIHN0YXJ0X29mZnNldDsKKwljaGFyICptYXggPSAoY2hhciAqKShwYXJ0LT5vZmZzZXQgKyBwYXJ0LT5zaXplIC0gc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUpKTsKKwljaGFyICpvZmZzZXQgPSAoY2hhciAqKShwYXJ0LT5vZmZzZXQgKyBzdGFydF9vZmZzZXQpOwogCXUzMiBvZmY7CiAKIAl3aGlsZSAob2Zmc2V0IDwgbWF4ICYmCkBAIC00NjgsMTEgKzUyOSwxMSBAQAogCQlpZiAoKCh1MzIpb2Zmc2V0ICYgKCgxIDw8IFNQSU5fQkxLU0laRSktMSkpID09IDApIGJyZWFrOwogCX0KIAotCXJldHVybiBvZmZzZXQgLSBwYXJ0LT5vZmZzZXQ7CisJcmV0dXJuICh1MzIpb2Zmc2V0IC0gcGFydC0+b2Zmc2V0OwogfQogCi1zdGF0aWMgdTMyCi1qZmZzX2luaXRfMXBhc3NfbGlzdChzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0KQordm9pZAoramZmczJfZnJlZV9jYWNoZShzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0KQogewogCXN0cnVjdCBiX2xpc3RzICpwTDsKIApAQCAtNDgyLDYgKzU0MywxNSBAQAogCQlmcmVlX25vZGVzKCZwTC0+ZGlyKTsKIAkJZnJlZShwTCk7CiAJfQorfQorCitzdGF0aWMgdTMyCitqZmZzX2luaXRfMXBhc3NfbGlzdChzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0KQoreworCXN0cnVjdCBiX2xpc3RzICpwTDsKKworCWpmZnMyX2ZyZWVfY2FjaGUocGFydCk7CisKIAlpZiAoTlVMTCAhPSAocGFydC0+amZmczJfcHJpdiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGJfbGlzdHMpKSkpIHsKIAkJcEwgPSAoc3RydWN0IGJfbGlzdHMgKilwYXJ0LT5qZmZzMl9wcml2OwogCkBAIC05NzksMjUgKzEwNDksMTMgQEAKIAkJREVCVUdGICgicmVzY2FuOiBGaXJzdCB0aW1lIGluIHVzZVxuIik7CiAJCXJldHVybiAxOwogCX0KKwogCS8qIGlmIHdlIGhhdmUgbm8gbGlzdCwgd2UgbmVlZCB0byByZXNjYW4gKi8KIAlpZiAocEwtPmZyYWcubGlzdENvdW50ID09IDApIHsKIAkJREVCVUdGICgicmVzY2FuOiBmcmFnbGlzdCB6ZXJvXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JLyogb3IgaWYgd2UgYXJlIHNjYW5uaW5nIGEgbmV3IHBhcnRpdGlvbiAqLwotCWlmIChwTC0+cGFydE9mZnNldCAhPSBwYXJ0LT5vZmZzZXQpIHsKLQkJREVCVUdGICgicmVzY2FuOiBkaWZmZXJlbnQgcGFydGl0aW9uXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKLQlpZiAobmFuZGRldiAhPSAoaW50KXBhcnQtPnVzcl9wcml2IC0gMSkgewotCQlERUJVR0YgKCJyZXNjYW46IG5hbmQgZGV2aWNlIGNoYW5nZWRcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCi0KIAkvKiBidXQgc3VwcG9zZSBzb21lb25lIHJlZmxhc2hlZCBhIHBhcnRpdGlvbiBhdCB0aGUgc2FtZSBvZmZzZXQuLi4gKi8KIAliID0gcEwtPmRpci5saXN0SGVhZDsKIAl3aGlsZSAoYikgewpAQCAtMTA4NywxMCArMTE0NSw2IEBACiAJdTMyIGNvdW50ZXJGID0gMDsKIAl1MzIgY291bnRlck4gPSAwOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKLQluYW5kZGV2ID0gKGludClwYXJ0LT51c3JfcHJpdiAtIDE7Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgKi8KLQogCS8qIHR1cm4gb2ZmIHRoZSBsY2QuICBSZWZyZXNoaW5nIHRoZSBsY2QgYWRkcyA1MCUgb3ZlcmhlYWQgdG8gdGhlICovCiAJLyogamZmczIgbGlzdCBidWlsZGluZyBlbnRlcnByaXNlIG5vcGUuICBpbiBuZXdlciB2ZXJzaW9ucyB0aGUgb3ZlcmhlYWQgaXMgKi8KIAkvKiBvbmx5IGFib3V0IDUgJS4gIG5vdCBlbm91Z2ggdG8gaW5jb252ZW5pZW5jZSBwZW9wbGUgZm9yLiAqLwpAQCAtMTA5OSw3ICsxMTUzLDYgQEAKIAkvKiBpZiB3ZSBhcmUgYnVpbGRpbmcgYSBsaXN0IHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgY2FjaGUuICovCiAJamZmc19pbml0XzFwYXNzX2xpc3QocGFydCk7CiAJcEwgPSAoc3RydWN0IGJfbGlzdHMgKilwYXJ0LT5qZmZzMl9wcml2OwotCXBMLT5wYXJ0T2Zmc2V0ID0gcGFydC0+b2Zmc2V0OwogCW9mZnNldCA9IDA7CiAJcHV0cyAoIlNjYW5uaW5nIEpGRlMyIEZTOiAgICIpOwogCkBAIC0xMjE3LDYgKzEyNzAsOSBAQAogc3RhdGljIHN0cnVjdCBiX2xpc3RzICoKIGpmZnMyX2dldF9saXN0KHN0cnVjdCBwYXJ0X2luZm8gKiBwYXJ0LCBjb25zdCBjaGFyICp3aG8pCiB7CisJLyogY29weSByZXF1ZXN0ZWQgcGFydF9pbmZvIHN0cnVjdCBwb2ludGVyIHRvIGdsb2JhbCBsb2NhdGlvbiAqLworCWN1cnJlbnRfcGFydCA9IHBhcnQ7CisKIAlpZiAoamZmczJfMXBhc3NfcmVzY2FuX25lZWRlZChwYXJ0KSkgewogCQlpZiAoIWpmZnMyXzFwYXNzX2J1aWxkX2xpc3RzKHBhcnQpKSB7CiAJCQlwcmludGYoIiVzOiBGYWlsZWQgdG8gc2NhbiBKRkZTdjIgZmlsZSBzdHJ1Y3R1cmVcbiIsIHdobyk7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9qZmZzMl9wcml2YXRlLmggYi9mcy9qZmZzMi9qZmZzMl9wcml2YXRlLmgKaW5kZXggZDUzZTU3Ni4uNjVjYTZlYiAxMDA2NDQKLS0tIGEvZnMvamZmczIvamZmczJfcHJpdmF0ZS5oCisrKyBiL2ZzL2pmZnMyL2pmZnMyX3ByaXZhdGUuaApAQCAtMjIsNyArMjIsNiBAQAogfTsKIAogc3RydWN0IGJfbGlzdHMgewotCWNoYXIgKnBhcnRPZmZzZXQ7CiAJc3RydWN0IGJfbGlzdCBkaXI7CiAJc3RydWN0IGJfbGlzdCBmcmFnOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQUROUEVTQzEuaCBiL2luY2x1ZGUvY29uZmlncy9BRE5QRVNDMS5oCmluZGV4IDJkMjEyYzkuLjJlZmNhMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BRE5QRVNDMS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BRE5QRVNDMS5oCkBAIC02NzQsNSArNjc0LDIxIEBACiAjdW5kZWYJQ0ZHX01FTVRFU1RfRU5ECiAjZW5kaWYKIAorLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24gKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIiIKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkiIgorKi8KIAogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BbGFza2E4MjIwLmggYi9pbmNsdWRlL2NvbmZpZ3MvQWxhc2thODIyMC5oCmluZGV4IGRjMDFmMGMuLjlhM2FjZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BbGFza2E4MjIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0FsYXNrYTgyMjAuaApAQCAtMjI5LDE3ICsyMjksNiBAQAogI3VuZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKICNlbmRpZgogCi0jaWZuZGVmIENGR19KRkZTMl9GSVJTVF9TRUNUT1IKLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX1NFQ1RPUgkwCi0jZW5kaWYKLSNpZm5kZWYgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksKLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMAotI2VuZGlmCi0jaWZuZGVmIENGR19KRkZTMl9OVU1fQkFOS1MKLSNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUwkxCi0jZW5kaWYKLSNkZWZpbmUgQ0ZHX0pGRlMyX0xBU1RfQkFOSyAoQ0ZHX0pGRlMyX0ZJUlNUX0JBTksgKyBDRkdfSkZGUzJfTlVNX0JBTktTIC0gMSkKLQogLyoKICAqIE1lbW9yeSBtYXAKICAqLwpAQCAtMzE0LDQgKzMwMywyMyBAQAogI2RlZmluZSBDRkdfSElEMF9JTklUCQlISUQwX0lDRSB8IEhJRDBfSUNGSQogI2RlZmluZSBDRkdfSElEMF9GSU5BTAkJSElEMF9JQ0UKIAorLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqLworCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uICovCisvKgorI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweDAwNDAwMDAwCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCisqLworCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWFsYXNrYS0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1hbGFza2EtMDo0bSh1c2VyKSIKKyovCisKICNlbmRpZiAvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQkFCN3h4LmggYi9pbmNsdWRlL2NvbmZpZ3MvQkFCN3h4LmgKaW5kZXggNWRkN2E3ZS4uODFjOGQ1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0JBQjd4eC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9CQUI3eHguaApAQCAtMjgsOCArMjgsNiBAQAogI2lmbmRlZiBfX0NPTkZJR19ICiAjZGVmaW5lIF9fQ09ORklHX0gKIAotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLQogI3VuZGVmICBERUJVRwogI2RlZmluZSBHVFJFR1JFQUQoeCkgMHhmZmZmZmZmZiAgICAgICAgIC8qIG5lZWRlZCBmb3IgZGVidWcgKi8KIApAQCAtMjAxLDggKzE5OSwyNSBAQAogI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVCAgICAxMjAwMDAgICAgICAvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpICovCiAjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUICAgIDUwMCAgICAgICAgIC8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlIChpbiBtcykgKi8KIAotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSyAgICAwICAgICAgICAgICAvKiB1c2UgZm9yIEpGRlMyICovCi0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MgICAgIDEgICAgICAgICAgIC8qICEgc2Vjb25kIGJhbmsgY29udGFpbnMgVS1Cb290ICovCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQKKyAqCisgKiBOb3RlOiBmYWtlIG10ZF9pZCB1c2VkLCBubyBsaW51eCBtdGQgbWFwIGZpbGUKKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWJhYjd4eC0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1iYWI3eHgtMDotKGpmZnMyKSIKKyovCiAKICNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRSAgICAgICAgQ0ZHX0ZMQVNIX0JBU0UKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOICAgICAgICAgMHg0MDAwMCAgICAgLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DQVRjZW50ZXIuaCBiL2luY2x1ZGUvY29uZmlncy9DQVRjZW50ZXIuaAppbmRleCA2MTAyMmU4Li43NzZmY2U1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ0FUY2VudGVyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NBVGNlbnRlci5oCkBAIC0zNzcsMTEgKzM3Nyw2IEBACiAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8JCS8qIHByaW50ICdFJyBmb3IgZW1wdHkgc2VjdG9yIG9uIGZsaW5mbyAqLwogCi0jaWYgMCAvKiB0ZXN0LW9ubHkgKi8KLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMAkvKiB1c2UgZm9yIEpGRlMyCQkJKi8KLSNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUwkxCS8qICEgc2Vjb25kIGJhbmsgY29udGFpbnMgVS1Cb290CSovCi0jZW5kaWYKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRW52aXJvbm1lbnQgVmFyaWFibGUgc2V0dXAKICAqLwpAQCAtNzY3LDkgKzc2MiwyNiBAQAogI2VuZGlmIC8qIENPTkZJR19OT19TRVJJQUxfRUVQUk9NICovCiAKICNkZWZpbmUgQ09ORklHX0pGRlMyX05BTkQgMQkJCS8qIGpmZnMyIG9uIG5hbmQgc3VwcG9ydCAqLwotI2RlZmluZSBDT05GSUdfSkZGUzJfTkFORF9ERVYgMAkJCS8qIG5hbmQgZGV2aWNlIGpmZnMyIGxpdmVzIG9uICovCi0jZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EX09GRiAwCQkJLyogc3RhcnQgb2YgamZmczIgcGFydGl0aW9uICovCi0jZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EX1NJWkUgMioxMDI0KjEwMjQJLyogc2l6ZSBvZiBqZmZzMiBwYXJ0aXRpb24gKi8KICNkZWZpbmUgTkFORF9DQUNIRV9QQUdFUyAxNgkJCS8qIHNpemUgb2YgbmFuZCBjYWNoZSBpbiA1MTIgYnl0ZXMgcGFnZXMgKi8KIAorLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24gKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibmFuZCIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHgwMDIwMDAwMAorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDAwMDAwMAorCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydAorICoKKyAqIE5vdGU6IGZha2UgbXRkX2lkIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZQorICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5hbmQwPWNhdGNlbnRlciIKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9Y2F0Y2VudGVyOjJtKG5hbmQpIgorKi8KKwogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1Mi5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmgKaW5kZXggNGJiNDdjMy4uZDE0OThlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmgKQEAgLTI0Miw4ICsyNDIsMjggQEAKIAogI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTwkJLyogcHJpbnQgJ0UnIGZvciBlbXB0eSBzZWN0b3Igb24gZmxpbmZvICovCiAKLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMAkgICAgLyogdXNlIGZvciBKRkZTMiAqLwotI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTCTEJICAgIC8qICEgc2Vjb25kIGJhbmsgY29udGFpbnMgVS1Cb290ICovCisKKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKi8KKworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgdXNlIHdob2xlIGRldmljZSAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisKKy8qIFVzZSBmaXJzdCBiYW5rIGZvciBKRkZTMiwgc2Vjb25kIGJhbmsgY29udGFpbnMgVS1Cb290LgorICoKKyAqIE5vdGU6IGZha2UgbXRkX2lkJ3MgdXNlZCwgbm8gbGludXggbXRkIG1hcCBmaWxlLgorICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjA9Y3BjaTQwNTItMCIKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9Y3BjaTQwNTItMDotKGpmZnMyKSIKKyovCiAKICNpZiAwIC8qIFVzZSBOVlJBTSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNUFCLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNUFCLmgKaW5kZXggZGVlMjZmOC4uMjliZDNkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVBQi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1QUIuaApAQCAtMjI1LDggKzIyNSwyNiBAQAogCiAjZGVmaW5lIENGR19GTEFTSF9FTVBUWV9JTkZPCQkvKiBwcmludCAnRScgZm9yIGVtcHR5IHNlY3RvciBvbiBmbGluZm8gKi8KIAotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSwkwCSAgICAvKiB1c2UgZm9yIEpGRlMyICovCi0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJMQkgICAgLyogISBzZWNvbmQgYmFuayBjb250YWlucyBVLUJvb3QgKi8KKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24gKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yMCIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHhGRkZGRkZGRgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDAwMDAwMAorCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworCisvKiBVc2UgZmlyc3QgYmFuayBmb3IgSkZGUzIsIHNlY29uZCBiYW5rIGNvbnRhaW5zIFUtQm9vdC4KKyAqCisgKiBOb3RlOiBmYWtlIG10ZF9pZCdzIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZS4KKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWNwY2k0MDVhYi0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1jcGNpNDA1YWItMDotKGpmZnMyKSIKKyovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEkyQyBFRVBST00gKENBVDI0V0MzMikgZm9yIGVudmlyb25tZW50CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNURULmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNURULmgKaW5kZXggNWM0MjU5ZC4uNjY3MzA3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVEVC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1RFQuaApAQCAtMjQ3LDggKzI0NywyNiBAQAogCiAjZGVmaW5lIENGR19GTEFTSF9FTVBUWV9JTkZPCQkvKiBwcmludCAnRScgZm9yIGVtcHR5IHNlY3RvciBvbiBmbGluZm8gKi8KIAotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSwkwCSAgICAvKiB1c2UgZm9yIEpGRlMyICovCi0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJMQkgICAgLyogISBzZWNvbmQgYmFuayBjb250YWlucyBVLUJvb3QgKi8KKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24gKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yMCIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHhGRkZGRkZGRgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDAwMDAwMAorCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworCisvKiBVc2UgZmlyc3QgYmFuayBmb3IgSkZGUzIsIHNlY29uZCBiYW5rIGNvbnRhaW5zIFUtQm9vdC4KKyAqCisgKiBOb3RlOiBmYWtlIG10ZF9pZCdzIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZS4KKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWNwY2k0MDVkdC0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1jcGNpNDA1ZHQtMDotKGpmZnMyKSIKKyovCiAKICNpZiAwIC8qIFVzZSBOVlJBTSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTc1MC5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k3NTAuaAppbmRleCBmYWIyNjNiLi44YmZkMGVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTc1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJNzUwLmgKQEAgLTM4LDggKzM4LDYgQEAKICNpZm5kZWYgX19DT05GSUdfSAogI2RlZmluZSBfX0NPTkZJR19ICiAKLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0KIC8qIFRoaXMgZGVmaW5lIG11c3QgYmUgYmVmb3JlIHRoZSBjb3JlLmggaW5jbHVkZSAqLwogI2RlZmluZSBDT05GSUdfQ1BDSTc1MAkJMQkvKiB0aGlzIGlzIGFuIENQQ0k3NTAgYm9hcmQJKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RCNjQzNjAuaCBiL2luY2x1ZGUvY29uZmlncy9EQjY0MzYwLmgKaW5kZXggZDZjZThhOC4uZTJiNGIxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0RCNjQzNjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvREI2NDM2MC5oCkBAIC04OCw4ICs4OCw2IEBACiAjaWZuZGVmIF9fQ09ORklHX0gKICNkZWZpbmUgX19DT05GSUdfSAogCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotCiAvKiBUaGlzIGRlZmluZSBtdXN0IGJlIGJlZm9yZSB0aGUgY29yZS5oIGluY2x1ZGUgKi8KICNkZWZpbmUgQ09ORklHX0RCNjQzNjAJCTEJLyogdGhpcyBpcyBhbiBEQjY0MzYwIGJvYXJkCSovCiAKQEAgLTIxOSwxMCArMjE3LDI3IEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAogCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24sIHdob2xlIGRldmljZSAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IxIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCiAKLS8qIEZsYXNoIGJhbmtzIEpGRlMyIHNob3VsZCB1c2UgKi8KLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMQotI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTCTEKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisKKy8qIFVzZSBmaXJzdCBiYW5rIGZvciBKRkZTMiwgc2Vjb25kIGJhbmsgY29udGFpbnMgVS1Cb290LgorICoKKyAqIE5vdGU6IGZha2UgbXRkX2lkJ3MgdXNlZCwgbm8gbGludXggbXRkIG1hcCBmaWxlLgorICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjE9ZGI2NDM2MC0xIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1kYjY0MzYwLTE6LShqZmZzMikiCisqLwogCiAjZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ09ORklHX0NNRF9ERkwgXAogCQkJIHwgQ0ZHX0NNRF9BU0tFTlYgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RCNjQ0NjAuaCBiL2luY2x1ZGUvY29uZmlncy9EQjY0NDYwLmgKaW5kZXggZmIwMjQ4MS4uNWY1NDFiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0RCNjQ0NjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvREI2NDQ2MC5oCkBAIC0yOCw4ICsyOCw2IEBACiAjaWZuZGVmIF9fQ09ORklHX0gKICNkZWZpbmUgX19DT05GSUdfSAogCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotCiAvKiBUaGlzIGRlZmluZSBtdXN0IGJlIGJlZm9yZSB0aGUgY29yZS5oIGluY2x1ZGUgKi8KICNkZWZpbmUgQ09ORklHX0RCNjQ0NjAJCTEJLyogdGhpcyBpcyBhbiBEQjY0NDYwIGJvYXJkCSovCiAKQEAgLTE1NywxMCArMTU1LDI3IEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAogCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24sIHdob2xlIGRldmljZSAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IxIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCiAKLS8qIEZsYXNoIGJhbmtzIEpGRlMyIHNob3VsZCB1c2UgKi8KLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMQotI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTCTEKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisKKy8qIFVzZSBmaXJzdCBiYW5rIGZvciBKRkZTMiwgc2Vjb25kIGJhbmsgY29udGFpbnMgVS1Cb290LgorICoKKyAqIE5vdGU6IGZha2UgbXRkX2lkJ3MgdXNlZCwgbm8gbGludXggbXRkIG1hcCBmaWxlLgorICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjE9ZGI2NDQ2MC0xIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1kYjY0NDYwLTE6LShqZmZzMikiCisqLwogCiAjZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ09ORklHX0NNRF9ERkwgXAogCQkJIHwgQ0ZHX0NNRF9BU0tFTlYgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RLMUMyMC5oIGIvaW5jbHVkZS9jb25maWdzL0RLMUMyMC5oCmluZGV4IDE0YTA5YjYuLmI1ODg0NmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ESzFDMjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvREsxQzIwLmgKQEAgLTUzNiw1ICs1MzYsMjEgQEAKICN1bmRlZglDRkdfTUVNVEVTVF9FTkQKICNlbmRpZgogCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkiIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSIiCisqLwogCiAjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RLMVMxMC5oIGIvaW5jbHVkZS9jb25maWdzL0RLMVMxMC5oCmluZGV4IGU3OWViNDkuLjNlMzgwM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ESzFTMTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvREsxUzEwLmgKQEAgLTU0NSw1ICs1NDUsMjEgQEAKICN1bmRlZglDRkdfTUVNVEVTVF9FTkQKICNlbmRpZgogCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkiIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSIiCisqLwogCiAjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VMUFBDLmggYi9pbmNsdWRlL2NvbmZpZ3MvRUxQUEMuaAppbmRleCA3MTc2OTA1Li5lNTFkMDU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRUxQUEMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRUxQUEMuaApAQCAtMjgsOCArMjgsNiBAQAogI2lmbmRlZiBfX0NPTkZJR19ICiAjZGVmaW5lIF9fQ09ORklHX0gKIAotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLQogI3VuZGVmICBERUJVRwogI2RlZmluZSBHVFJFR1JFQUQoeCkgMHhmZmZmZmZmZiAgICAgICAgIC8qIG5lZWRlZCBmb3IgZGVidWcgKi8KIApAQCAtMTgxLDggKzE3OSwyMyBAQAogI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVCAgICAxMjAwMDAgICAgICAvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpICovCiAjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUICAgIDUwMCAgICAgICAgIC8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlIChpbiBtcykgKi8KIAotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSyAgICAwICAgICAgICAgICAvKiB1c2UgZm9yIEpGRlMyICovCi0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MgICAgIDIgICAgICAgICAgIC8qICEgc2Vjb25kIGJhbmsgY29udGFpbnMgVS1Cb290ICovCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qIE5vdGU6IGZha2UgbXRkX2lkIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZSAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWVscHBjLTAsbm9yMT1lbHBwYy0xIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1lbHBwYy0wOi0oamZmczIpLGVscHBjLTE6LSh1c2VyKSIKKyovCiAKICNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRSAgICAgICAgQ0ZHX0ZMQVNIX0JBU0UKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOICAgICAgICAgMHg0MDAwMCAgICAgLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FVkI2NDI2MC5oIGIvaW5jbHVkZS9jb25maWdzL0VWQjY0MjYwLmgKaW5kZXggOWJhZjI1Mi4uNzhlNTcxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0VWQjY0MjYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VWQjY0MjYwLmgKQEAgLTI4LDggKzI4LDYgQEAKICNpZm5kZWYgX19DT05GSUdfSAogI2RlZmluZSBfX0NPTkZJR19ICiAKLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8Z2FsaWxlby9jb3JlLmg+CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9MQU5URUMuaCBiL2luY2x1ZGUvY29uZmlncy9MQU5URUMuaAppbmRleCA5MTAxMWJlLi45MzNhNDJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTEFOVEVDLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0xBTlRFQy5oCkBAIC0zNTYsNCArMzU2LDIxIEBACiAjZGVmaW5lCUJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkiIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSIiCisqLworCiAjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01IUEMuaCBiL2luY2x1ZGUvY29uZmlncy9NSFBDLmgKaW5kZXggZjk0MmU5NS4uY2QyMWMyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01IUEMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTUhQQy5oCkBAIC0xODQsOCArMTg0LDIzIEBACiAjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJQ0ZHX0ZMQVNIX0JBU0UKICNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSgxMjggPDwgMTApCS8qIFJlc2VydmUgMTI4IGtCIGZvciBtYWxsb2MoKQkqLwogCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCTAJICAgIC8qIHVzZSBmb3IgSkZGUzIgKi8KLSNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUwkxCSAgICAvKiBvbmUgZmxhc2ggb25seSAqLworLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24sIHdob2xlIGRldmljZSAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKiBOb3RlOiBmYWtlIG10ZF9pZCB1c2VkLCBubyBsaW51eCBtdGQgbWFwIGZpbGUgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1taHBjLTAiCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPW1ocGMtMDotKGpmZnMyKSIKKyovCiAKIC8qCiAgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTUlQNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvTUlQNDA1LmgKaW5kZXggNDFhM2QzOS4uMGFmOWM2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01JUDQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NSVA0MDUuaApAQCAtMjM2LDggKzIzNiwyMyBAQAogI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAkxMjAwMDAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKGluIG1zKQkqLwogI2RlZmluZSBDRkdfRkxBU0hfV1JJVEVfVE9VVAk1MDAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKGluIG1zKQkqLwogCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LICAgIDAgICAgICAgICAgIC8qIHVzZSBmb3IgSkZGUzIgKi8KLSNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUyAgICAgMSAgICAgICAgICAgLyogISBzZWNvbmQgYmFuayBjb250YWlucyBVLUJvb3QgKi8KKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKgorICovCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uLCB3aG9sZSBkZXZpY2UgKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yMCIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHhGRkZGRkZGRgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDAwMDAwMAorCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworLyogTm90ZTogZmFrZSBtdGRfaWQgdXNlZCwgbm8gbGludXggbXRkIG1hcCBmaWxlICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjA9bWlwNDA1LTAiCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPW1pcDQwNS0wOi0oamZmczIpIgorKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ2FjaGUgQ29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01MMi5oIGIvaW5jbHVkZS9jb25maWdzL01MMi5oCmluZGV4IGM2Y2M2OWIuLjZlNTRkNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NTDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTUwyLmgKQEAgLTI0MSw5ICsyNDEsMjIgQEAKICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKIAotLyogSkZGUzIgc3R1ZmYgKi8KKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKgorICovCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uLCB3aG9sZSBkZXZpY2UgKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yMCIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHhGRkZGRkZGRgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDA4MDAwMAogCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LIDAKLSNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUyAxCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9TRUNUT1IgMQorLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qIE5vdGU6IGZha2UgbXRkX2lkIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZSAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPW1sMi0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1tbDItMDotQDUxMmsoamZmczIpIgorKi8KKwogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4MjYwQURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2MEFEUy5oCmluZGV4IGJiYTQ3NmEuLjkxODhhZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4MjYwQURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzgyNjBBRFMuaApAQCAtMjc4LDEwICsyNzgsMTQgQEAKICNkZWZpbmUgQ0ZHX0ZMQVNIX1VOTE9DS19UT1VUCTEwMDAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIENsZWFyIExvY2sgQml0cyAoaW4gbXMpICovCiAjZGVmaW5lIENGR19GTEFTSF9QUk9URUNUSU9OCQkvKiAiUmVhbCIgKGhhcmR3YXJlKSBzZWN0b3JzIHByb3RlY3Rpb24gKi8KIAotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfU0VDVE9SICAxCi0jZGVmaW5lIENGR19KRkZTMl9MQVNUX1NFQ1RPUiAgIDI3CisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqIE5vdGU6IGZha2UgbXRkX2lkIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZQorICovCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1tcGM4MjYwYWRzLTAiCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPW1wYzgyNjBhZHMtMDotQDFtKGpmZnMyKSIKICNkZWZpbmUgQ0ZHX0pGRlMyX1NPUlRfRlJBR01FTlRTCi0jZGVmaW5lIENGR19KRkZTX0NVU1RPTV9QQVJUCiAKIC8qIHRoaXMgaXMgc3R1ZmYgY2FtZSBvdXQgb2YgdGhlIE1vdG9yb2xhIGRvY3MgKi8KICNpZm5kZWYgQ0ZHX0xPV0JPT1QKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4MjY2QURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2NkFEUy5oCmluZGV4IGQ4ZTkxYTUuLjBhNGIwNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4MjY2QURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzgyNjZBRFMuaApAQCAtNTczLDUgKzU3MywyMSBAQAogI2RlZmluZSBDRkdfUENJX01TVFJfSU9fU0laRSAgICAgICAgMHgwNDAwMDAwMCAgICAgICAgICAvKiA2NE1CICovCiAjZGVmaW5lIENGR19QT0NNUjJfTUFTS19BVFRSSUIgICAgICAoUE9DTVJfTUFTS182NE1CIHwgUE9DTVJfRU5BQkxFIHwgUE9DTVJfUENJX0lPKQogCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkiIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSIiCisqLwogCiAjZW5kaWYgLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL05DNjUwLmggYi9pbmNsdWRlL2NvbmZpZ3MvTkM2NTAuaAppbmRleCAzYWNkZDc3Li5kMjRkMDVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTkM2NTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTkM2NTAuaApAQCAtNDAwLDkgKzQwMCwyNyBAQAogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKICNkZWZpbmUgQ09ORklHX0pGRlMyX05BTkQgMQkJCS8qIGpmZnMyIG9uIG5hbmQgc3VwcG9ydCAqLwotI2RlZmluZSBDT05GSUdfSkZGUzJfTkFORF9ERVYgMAkJCS8qIG5hbmQgZGV2aWNlIGpmZnMyIGxpdmVzIG9uICovCi0jZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EX09GRiAwCQkJLyogc3RhcnQgb2YgamZmczIgcGFydGl0aW9uICovCi0jZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EX1NJWkUgNCoxMDI0KjEwMjQJLyogc2l6ZSBvZiBqZmZzMiBwYXJ0aXRpb24gKi8KICNkZWZpbmUgTkFORF9DQUNIRV9QQUdFUyAxNgkJCS8qIHNpemUgb2YgbmFuZCBjYWNoZSBpbiA1MTIgYnl0ZXMgcGFnZXMgKi8KIAorLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqLworCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5hbmQwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweDAwNDAwMDAwCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjA9bmM2NTAtMCxuYW5kMD1uYzY1MC1uYW5kIgorCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPW5jNjUwLTA6MW0oa2VybmVsMSksMW0oa2VybmVsMiksIiBcCisJCQkJCSIyNTYwayhjcmFtZnMxKSwyNTYwayhjcmFtZnMyKSwiIFwKKwkJCQkJIjI1NmsodS1ib290KSwyNTZrKGVudik7IiBcCisJCQkJIm5jNjUwLW5hbmQ6NG0obmFuZDEpLDI4bShuYW5kMikiCisqLworCiAjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL05FVFRBLmggYi9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEuaAppbmRleCAxZDEyZWI0Li4zNTczYjM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEuaApAQCAtNjg1LDExICs2ODUsMjYgQEAKIAkoKHVuc2lnbmVkIGNoYXIpKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSh1bnNpZ25lZCBsb25nKShhZHIpKSkKIAogI2RlZmluZSBDT05GSUdfSkZGUzJfTkFORAkxCQkJLyogamZmczIgb24gbmFuZCBzdXBwb3J0ICovCi0jZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EX0RFVgkwCQkJLyogbmFuZCBkZXZpY2UgamZmczIgbGl2ZXMgb24gKi8KLSNkZWZpbmUgQ09ORklHX0pGRlMyX05BTkRfT0ZGCSgyICogMTAyNCAqIDEwMjQpCS8qIHN0YXJ0IG9mIGpmZnMyIHBhcnRpdGlvbiAqLwotI2RlZmluZSBDT05GSUdfSkZGUzJfTkFORF9TSVpFCSgxKjEwMjQqMTAyNCkJCS8qIHNpemUgb2YgamZmczIgcGFydGl0aW9uICovCiAjZGVmaW5lIE5BTkRfQ0FDSEVfUEFHRVMJMTYJCQkvKiBzaXplIG9mIG5hbmQgY2FjaGUgaW4gNTEyIGJ5dGVzIHBhZ2VzICovCiAKKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKgorICovCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uLCB3aG9sZSBkZXZpY2UgKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibmFuZDAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4MDAxMDAwMDAgCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMjAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKiBOb3RlOiBmYWtlIG10ZF9pZCB1c2VkLCBubyBsaW51eCBtdGQgbWFwIGZpbGUgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibmFuZDA9bmV0dGEtbmFuZCIKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9bmV0dGEtbmFuZDoxbUAybShqZmZzMikiCisqLworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNkZWZpbmUgQ0ZHX0RJUkVDVF9GTEFTSF9URlRQCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE1DNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvUE1DNDA1LmgKaW5kZXggZDhkOTYzMi4uMTFkNmZhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BNQzQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTUM0MDUuaApAQCAtMTkzLDggKzE5MywyMyBAQAogCiAjZGVmaW5lIENGR19GTEFTSF9FTVBUWV9JTkZPCQkvKiBwcmludCAnRScgZm9yIGVtcHR5IHNlY3RvciBvbiBmbGluZm8gKi8KIAotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSwkwCSAgICAvKiB1c2UgZm9yIEpGRlMyICovCi0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJMQkgICAgLyogISBzZWNvbmQgYmFuayBjb250YWlucyB1LWJvb3QJKi8KKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zIC0gc2Vjb25kIGJhbmsgY29udGFpbnMgdS1ib290CisgKgorICovCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uLCB3aG9sZSBkZXZpY2UgKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yMCIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHhGRkZGRkZGRgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDAwMDAwMAorCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworLyogTm90ZTogZmFrZSBtdGRfaWQgdXNlZCwgbm8gbGludXggbXRkIG1hcCBmaWxlICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjA9cG1jNDA1LTAiCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPXBtYzQwNS0wOi0oamZmczIpIgorKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRW52aXJvbm1lbnQgVmFyaWFibGUgc2V0dXAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QUENoYW1lbGVvbkVWQi5oIGIvaW5jbHVkZS9jb25maWdzL1BQQ2hhbWVsZW9uRVZCLmgKaW5kZXggY2EwYmQxMi4uMmQ4OWYzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BQQ2hhbWVsZW9uRVZCLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BQQ2hhbWVsZW9uRVZCLmgKQEAgLTMzNiw5ICszMzYsMTkgQEAKICAqIFBsZWFzZSBub3RlIHRoYXQgQ0ZHX1NEUkFNX0JBU0UgX211c3RfIHN0YXJ0IGF0IDAKICAqLwogI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAorCisvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uaXRvcgkqLwogI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRkZDMDAwMAogI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCUNGR19GTEFTSF9CQVNFCi0jZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiAqIDEwMjQpCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiAqIDEwMjQpCisKKy8qIFJlc2VydmUgMzIwIGtCIGZvciBNb25pdG9yCSovCisvKgorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRkZCMDAwMAorI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCUNGR19GTEFTSF9CQVNFCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDMyMCAqIDEwMjQpCisqLworCiAjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMjU2ICogMTAyNCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIG1hbGxvYygpCSovCiAKIC8qCkBAIC0zNjksMTEgKzM3OSw2IEBACiAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8JCS8qIHByaW50ICdFJyBmb3IgZW1wdHkgc2VjdG9yIG9uIGZsaW5mbyAqLwogCi0jaWYgMCAvKiB0ZXN0LW9ubHkgKi8KLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMAkgLyogdXNlIGZvciBKRkZTMiAqLwotI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTCTEJIC8qICEgc2Vjb25kIGJhbmsgY29udGFpbnMgVS1Cb290ICovCi0jZW5kaWYKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRW52aXJvbm1lbnQgVmFyaWFibGUgc2V0dXAKICAqLwpAQCAtNzcwLDkgKzc3NSwzNiBAQAogI2VuZGlmIC8qIENPTkZJR19OT19TRVJJQUxfRUVQUk9NICovCiAKICNkZWZpbmUgQ09ORklHX0pGRlMyX05BTkQgMQkJCS8qIGpmZnMyIG9uIG5hbmQgc3VwcG9ydCAqLwotI2RlZmluZSBDT05GSUdfSkZGUzJfTkFORF9ERVYgMAkJCS8qIG5hbmQgZGV2aWNlIGpmZnMyIGxpdmVzIG9uICovCi0jZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EX09GRiAwCQkJLyogc3RhcnQgb2YgamZmczIgcGFydGl0aW9uICovCi0jZGVmaW5lIENPTkZJR19KRkZTMl9OQU5EX1NJWkUgNCoxMDI0KjEwMjQJLyogc2l6ZSBvZiBqZmZzMiBwYXJ0aXRpb24gKi8KICNkZWZpbmUgTkFORF9DQUNIRV9QQUdFUyAxNgkJCS8qIHNpemUgb2YgbmFuZCBjYWNoZSBpbiA1MTIgYnl0ZXMgcGFnZXMgKi8KIAorLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqLworCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5hbmQwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweDAwNDAwMDAwCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjA9UFBDaGFtZWxlb24tMCxuYW5kMD1wcGNoYW1lbGVvbmV2Yi1uYW5kIgorKi8KKworLyogMjU2IGtCIFUtYm9vdCBpbWFnZSAqLworLyoKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9UFBDaGFtZWxlb24tMDoxbShrZXJuZWwxKSwxbShrZXJuZWwyKSwiIFwKKwkJCQkJIjE3OTJrKHVzZXIpLDI1NmsodS1ib290KTsiIFwKKwkJCQkicHBjaGFtZWxlb25ldmItbmFuZDotKG5hbmQpIgorKi8KKworLyogMzIwIGtCIFUtYm9vdCBpbWFnZSAqLworLyoKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9UFBDaGFtZWxlb24tMDoxbShrZXJuZWwxKSwxbShrZXJuZWwyKSwiIFwKKwkJCQkJIjE3MjhrKHVzZXIpLDMyMGsodS1ib290KTsiIFwKKwkJCQkicHBjaGFtZWxlb25ldmItbmFuZDotKG5hbmQpIgorKi8KKwogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9SMzYwTVBJLmggYi9pbmNsdWRlL2NvbmZpZ3MvUjM2ME1QSS5oCmluZGV4IGM0NTZmYmYuLmQ3YjA5M2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9SMzYwTVBJLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1IzNjBNUEkuaApAQCAtMTUyLDEwICsxNTIsMjIgQEAKIAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0vKiBKRkZTMiBzdHVmZiAqLwotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSwkwCi0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJMQotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfU0VDVE9SCTI0CisvKgorICogSkZGUzIgcGFydGl0aW9ucworICovCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uCisgKiB1c2UgYWxsIHRoZSBzcGFjZSBzdGFydGluZyBhdCBvZmZzZXQgM01CKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yMCIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHhGRkZGRkZGRgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDMwMDAwMAorCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPXIzNjAtMCIKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9cjM2MC0wOi1AM20odXNlcikiCisqLwogCiAvKgogICogTG93IExldmVsIENvbmZpZ3VyYXRpb24gU2V0dGluZ3MKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9SQkM4MjMuaCBiL2luY2x1ZGUvY29uZmlncy9SQkM4MjMuaAppbmRleCBiMGU0OTEwLi40ZDQ3ZDNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUkJDODIzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1JCQzgyMy5oCkBAIC00MTcsNCArNDE3LDIyIEBACiAjZGVmaW5lCUJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qIE5vdGU6IGZha2UgbXRkX2lkIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZSAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSIiCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIiIKKyovCisKICNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUmF0dGxlci5oIGIvaW5jbHVkZS9jb25maWdzL1JhdHRsZXIuaAppbmRleCBhNTUyOTcwLi5hMTcwZjI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUmF0dGxlci5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SYXR0bGVyLmgKQEAgLTE4NiwxMCArMTg2LDI2IEBACiAjZGVmaW5lCUNGR19ESVJFQ1RfRkxBU0hfVEZUUAogCiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCTAKICNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUwlDRkdfTUFYX0ZMQVNIX0JBTktTCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9TRUNUT1IgIDE2CiAjZGVmaW5lIENGR19KRkZTMl9TT1JUX0ZSQUdNRU5UUworCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMTAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKiBOb3RlOiBmYWtlIG10ZF9pZCB1c2VkLCBubyBsaW51eCBtdGQgbWFwIGZpbGUgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1yYXR0bGVyLTAiCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPXJhdHRsZXItMDotQDFtKGpmZnMyKSIKKyovCiAjZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLwogCiAjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJVEVYVF9CQVNFCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvU1hOSTg1NVQuaCBiL2luY2x1ZGUvY29uZmlncy9TWE5JODU1VC5oCmluZGV4IDE5NWMwMzYuLjljZTgzYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9TWE5JODU1VC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9TWE5JODU1VC5oCkBAIC0xNTQsMTQgKzE1NCwzMiBAQAogLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwogI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCi0jZGVmaW5lIENGR19KRkZTX0NVU1RPTV9QQVJUCiAjZGVmaW5lIENGR19KRkZTMl9TT1JUX0ZSQUdNRU5UUwotLyogSkZGUzIgbG9jYXRpb24gd2hlbiB1c2luZyBOT1IgZmxhc2ggKi8KLSNkZWZpbmUgQ0ZHX0pGRlMyX0JBU0UJKENGR19GTEFTSF9CQVNFICsgMHg4MDAwMCkKLSNkZWZpbmUgQ0ZHX0pGRlMyX1NJWkUJKDB4NzgwMDAwKQotLyogSkZGUzIgbG9jYXRpb24gKGluIFJBTSkgd2hlbiB1c2luZyBOQU5EIGZsYXNoICovCi0jZGVmaW5lCUNGR19KRkZTMl9SQU1CQVNFIDB4NDAwMDAwCi0jZGVmaW5lCUNGR19KRkZTMl9SQU1TSVpFIDB4MjAwMDAwCS8qIE5BTkQgYm9vdCBwYXJ0aXRpb24gaXMgMk1pQgkqLworCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisKKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweDAwNzgwMDAwCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDgwMDAwCisqLworCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJuYW5kMCIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHgwMDIwMDAwMAorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDAwMDAwMAorCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworLyogTm90ZTogZmFrZSBtdGRfaWQgdXNlZCwgbm8gbGludXggbXRkIG1hcCBmaWxlICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjA9c2l4bmV0LTAsbmFuZDA9c2l4bmV0LW5hbmQiCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPXNpeG5ldC0wOjc2ODBrQDUxMmsoKTtzaXhuZXQtbmFuZDoybShqZmZzMi1uYW5kKSIKKyovCiAKIC8qIE5BTkQgZmxhc2ggc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfTVREX05BTkRfRUNDX0pGRlMyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvWlVNQS5oIGIvaW5jbHVkZS9jb25maWdzL1pVTUEuaAppbmRleCA1NzhmMTUyLi5mMTYzZDAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvWlVNQS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9aVU1BLmgKQEAgLTI4LDggKzI4LDYgQEAKICNpZm5kZWYgX19DT05GSUdfSAogI2RlZmluZSBfX0NPTkZJR19ICiAKLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0KICNkZWZpbmUgQ0ZHX0dUXzY0MjZ4ICAgICAgICBHVF82NDI2MCAvKiB3aXRoIGEgNjQyNjAgc3lzdGVtIGNvbnRyb2xsZXIgKi8KICNkZWZpbmUgQ09ORklHX0VUSEVSX1BPUlRfTUlJCS8qIHVzZSB0d28gTUlJIHBvcnRzICovCiAjZGVmaW5lIENPTkZJR19JTlRFTF9MWFQ5N1gJLyogSW50ZWwgTFhUOTdYIHBoeSAqLwpAQCAtMTE1LDkgKzExMywyMyBAQAogCQkJCSBDRkdfQ01EX01JSQl8IFwKIAkJCQkgQ0ZHX0NNRF9EQVRFKQogCi0vKiBGbGFzaCBiYW5rcyBKRkZTMiBzaG91bGQgdXNlICovCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCTEKLSNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUwkyCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qIE5vdGU6IGZha2UgbXRkX2lkIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZSAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IxPXp1bWEtMSxub3IyPXp1bWEtMiIKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9enVtYS0xOi0oamZmczIpLHp1bWEtMjotKHVzZXIpIgorKi8KIAogLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwogI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2RlYnJpcy5oIGIvaW5jbHVkZS9jb25maWdzL2RlYnJpcy5oCmluZGV4IGE5YTI0NTguLmI0ODNmNDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9kZWJyaXMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvZGVicmlzLmgKQEAgLTIxNyw4ICsyMTcsMjcgQEAKICNkZWZpbmUgQ0ZHX0ZMQVNIX1JBTkdFX1NJWkUJMHgwMTAwMDAwMAogI2RlZmluZSBGTEFTSF9CQVNFMF9QUkVMSU0JMHg3QzAwMDAwMAkvKiBkZWJyaXMgZmxhc2gJCSovCiAKLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksgICAgMCAgICAgICAgICAgLyogdXNlIGZvciBKRkZTMiAqLwotI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTICAgICAxCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKworLyogVXNlIGZpcnN0IGJhbmsgZm9yIEpGRlMyLCBzZWNvbmQgYmFuayBjb250YWlucyBVLUJvb3QuCisgKgorICogTm90ZTogZmFrZSBtdGRfaWQncyB1c2VkLCBubyBsaW51eCBtdGQgbWFwIGZpbGUuCisgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1kZWJyaXMtMCIKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9ZGVicmlzLTA6LShqZmZzMikiCisqLwogCiAjZGVmaW5lIENGR19FTlZfSVNfSU5fTlZSQU0gICAgICAxCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFICAgICAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZXA3MzEyLmggYi9pbmNsdWRlL2NvbmZpZ3MvZXA3MzEyLmgKaW5kZXggYzZhMDI4Zi4uYmRkYTYyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2VwNzMxMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9lcDczMTIuaApAQCAtMTQyLDkgKzE0MiwyMiBAQAogI2RlZmluZSBDRkdfRU5WX0FERFIJCShQSFlTX0ZMQVNIXzEgKyAweDIwMDAwKQkvKiBBZGRyIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLwogI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KIAotLyogRmxhc2ggYmFua3MgSkZGUzIgc2hvdWxkIHVzZSAqLwotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSyAgICAwCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9TRUNUT1IJMgotI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTICAgICAxCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qIE5vdGU6IGZha2UgbXRkX2lkIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZSAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWVwNzMxMi0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1lcDczMTItMDotKGpmZnMyKSIKKyovCiAKICNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZXA4MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZXA4MjYwLmgKaW5kZXggOThlMTcxNi4uOGIwYWZkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2VwODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9lcDgyNjAuaApAQCAtNzQ0LDQgKzc0NCwyMiBAQAogI2RlZmluZSBCT09URkxBR19DT0xEICAgMHgwMSAgICAvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTSAgIDB4MDIgICAgLyogU29mdHdhcmUgcmVib290ICAgICAgICAgICAgICAgICAgICovCiAKKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKgorICovCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uLCB3aG9sZSBkZXZpY2UgKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yMCIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHhGRkZGRkZGRgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDAwMDAwMAorCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworLyogTm90ZTogZmFrZSBtdGRfaWQgdXNlZCwgbm8gbGludXggbXRkIG1hcCBmaWxlICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIiIKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkiIgorKi8KKwogI2VuZGlmICAvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaHltb2QuaCBiL2luY2x1ZGUvY29uZmlncy9oeW1vZC5oCmluZGV4IDBkNjJiOWUuLmFhZGI1OWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9oeW1vZC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9oeW1vZC5oCkBAIC03MTIsNCArNzEyLDIxIEBACiAjZGVmaW5lCUJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KIAorLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24sIHdob2xlIGRldmljZSAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIiIKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkiIgorKi8KKwogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pbXBhNy5oIGIvaW5jbHVkZS9jb25maWdzL2ltcGE3LmgKaW5kZXggYzE4N2M1NC4uOGI4NDFmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2ltcGE3LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2ltcGE3LmgKQEAgLTE0NCw5ICsxNDQsMjEgQEAKICNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoUEhZU19GTEFTSF8xICsgMHgxQzAwMCkJLyogQWRkciBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KICNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDQwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KIAotLyogRmxhc2ggYmFua3MgSkZGUzIgc2hvdWxkIHVzZSAqLwotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSyAgICAwCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9TRUNUT1IJOAotI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTICAgICAyCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICoKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMjAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1pbXBBNyBOT1IgRmxhc2ggQmFuayAjMCxub3IxPWltcEE3IE5PUiBGbGFzaCBCYW5rICMxIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1pbXBBNyBOT1IgRmxhc2ggQmFuayAjMDotKEZpbGVTeXN0ZW0xKTtpbXBBNyBOT1IgRmxhc2ggQmFuayAjMTotKEZpbGVTeXN0ZW0yKSIKKyovCiAKICNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaW5jYWlwLmggYi9pbmNsdWRlL2NvbmZpZ3MvaW5jYWlwLmgKaW5kZXggN2RiMzc0NC4uMGY1NDhhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2luY2FpcC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9pbmNhaXAuaApAQCAtMTQ4LDggKzE0OCwyNiBAQAogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCiAjZGVmaW5lIENPTkZJR19JTkNBX0lQX1NXSVRDSF9BTURJWAogCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCTEKLSNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUwkxCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICovCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uLCB1c2UgYWxsIHNwYWNlIG9uIHRoZSBkZXZpY2UgKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yMSIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHhGRkZGRkZGRgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDAwMDAwMAorCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPUlOQ0EtSVAgQmFuayAwIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1JTkNBLUlQIEJhbmsgMDoxOTJrKHVib290KSwiIFwKKwkJCQkJCQkiNjRrKGVudiksIiBcCisJCQkJCQkJIjc2OGsobGludXgpLCIgXAorCQkJCQkJCSIxbUAzbShyb290ZnMpLCIgXAorCQkJCQkJCSI3NjhrKGxpbnV4MiksIiBcCisJCQkJCQkJIjNtQDVtKHJvb3RmczIpIgorKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ2FjaGUgQ29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2lubm9rb20uaCBiL2luY2x1ZGUvY29uZmlncy9pbm5va29tLmgKaW5kZXggZmNlNzJlMS4uM2NiOWViYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2lubm9rb20uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaW5ub2tvbS5oCkBAIC0xNjQsMTQgKzE2NCw0MiBAQAogCiAjZGVmaW5lIENGR19GTEFTSF9CQVNFICAgICAgICAgIFBIWVNfRkxBU0hfMQogCi0KIC8qCi0gKiBKRkZTMiBQYXJ0aXRpb25zCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKgogICovCi0jZGVmaW5lIENGR19KRkZTX0NVU1RPTV9QQVJUCTEJCS8qIHNlZSBib2FyZC9pbm5va29tL2ZsYXNoLmMgKi8KLSNkZWZpbmUgQ09ORklHX01URF9JTk5PS09NXzE2TUIgMQkJLyogZGV2ZWxvcG1lbnQgZmxhc2ggICAgICAgICAqLwotI3VuZGVmICBDT05GSUdfTVREX0lOTk9LT01fNjRNQgkJCS8qIHByb2R1Y3Rpb24gZmxhc2ggICAgICAgICAgKi8KKy8qIGRldmVsb3BtZW50IGZsYXNoICovCisjZGVmaW5lIENPTkZJR19NVERfSU5OT0tPTV8xNk1CCTEKKyN1bmRlZiBDT05GSUdfTVREX0lOTk9LT01fNjRNQgogCisvKiBwcm9kdWN0aW9uIGZsYXNoICovCisvKgorI2RlZmluZSBDT05GSUdfTVREX0lOTk9LT01fNjRNQgkxCisjdW5kZWYgQ09ORklHX01URF9JTk5PS09NXzE2TUIKKyovCisKKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24sIHdob2xlIGRldmljZSAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKiBOb3RlOiBmYWtlIG10ZF9pZCB1c2VkLCBubyBsaW51eCBtdGQgbWFwIGZpbGUgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1pbm5va29tLTAiCisqLworCisvKiBkZXZlbG9wbWVudCBmbGFzaCAqLworLyoKKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9aW5ub2tvbS0wOjI1NmsodWJvb3QpLDc2OGsoa2VybmVsKSw4bSh1c2VyKSw3bShkYXRhKSIKKyovCisKKy8qIHByb2R1Y3Rpb24gZmxhc2ggKi8KKy8qCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPWlubm9rb20tMDoyNTZrKHVib290KSw3NjhrKGtlcm5lbCksMTYyNTZrKHVzZXIxKSwxNjI1NmsodXNlcjIpLDMybShkYXRhKSIKKyovCiAKIC8qCiAgKiBHUElPIHNldHRpbmdzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbW9kbmV0NTAuaCBiL2luY2x1ZGUvY29uZmlncy9tb2RuZXQ1MC5oCmluZGV4IDA2N2M4NDYuLjIwMjg3NjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9tb2RuZXQ1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tb2RuZXQ1MC5oCkBAIC0xNjUsOSArMTY1LDIyIEBACiAjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFICAgICAgIDB4MTAwMDAgLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KICNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDQwMDAJLyogbWF4IHNpemUgZm9yIGVudmlyb25tZW50ICovCiAKLS8qIEZsYXNoIGJhbmtzIEpGRlMyIHNob3VsZCB1c2UgKi8KLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksgICAgMAotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfU0VDVE9SCTgKLSNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUyAgICAgMgorLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24sIHdob2xlIGRldmljZSAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDgwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKiBOb3RlOiBmYWtlIG10ZF9pZCB1c2VkLCBubyBsaW51eCBtdGQgbWFwIGZpbGUgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1tb2RuZXQ1MC0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1tb2RuZXQ1MC0wOi1ANTEyayhqZmZzMikiCisqLwogCiAjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL214MWZzMi5oIGIvaW5jbHVkZS9jb25maWdzL214MWZzMi5oCmluZGV4IDdiNGRjOTIuLjk4MTZiZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9teDFmczIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbXgxZnMyLmgKQEAgLTg3LDcgKzg3LDYgQEAKICNkZWZpbmUJIENPTkZJR19JTklUUkRfVEFHCSAgICAgMQkgICAvKiBzZW5kIGluaXRyZCBwYXJhbXMJKi8KICN1bmRlZglDT05GSUdfVkZECQkJIC8qIGRvIG5vdCBzZW5kIGZyYW1lYnVmZmVyIHNldHVwICAgICovCiAKLSNkZWZpbmUgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQKIC8qCiAgKiBNYWxsb2MgcG9vbCBuZWVkIHRvIGhvc3QgZW52ICsgMTI4IEtiIHJlc2VydmUgZm9yIG90aGVyIGFsbG9jYXRpb25zLgogICovCkBAIC0xMzYsMTAgKzEzNSw2IEBACiAjZGVmaW5lIE1YMUZTMl9GTEFTSF9JTlRFUkxFQVZFIDIJLyogLi4uIG1hZGUgb2YgMiBjaGlwcyAqLwogI2RlZmluZSBNWDFGUzJfRkxBU0hfQkFOS19TSVpFCTB4MDIwMDAwMDAgIC8qIHNpemUgb2Ygb25lIGZsYXNoIGJhbmsqLwogI2RlZmluZSBNWDFGUzJfRkxBU0hfU0VDVF9TSVpFCTB4MDAwMjAwMDAgIC8qIHNpemUgb2YgZXJhc2Ugc2VjdG9yICovCi0jZGVmaW5lIE1YMUZTMl9KRkZTMl9QQVJUMF9TVEFSVCAweDEwMjAwMDAwCi0jZGVmaW5lIE1YMUZTMl9KRkZTMl9QQVJUMF9TSVpFCSAweDAwNTAwMDAwCi0jZGVmaW5lIE1YMUZTMl9KRkZTMl9QQVJUMV9TVEFSVCAweDEwNzAwMDAwCi0jZGVmaW5lIE1YMUZTMl9KRkZTMl9QQVJUMV9TSVpFCSAweDAwOTAwMDAwCiAjZWxzZQogI2RlZmluZSBNWDFGUzJfRkxBU0hfQlVTX1dJRFRICTIJLyogd2UgdXNlIDE2IGJpdCBGTEFTSCBtZW1vcnkuLi4gICAgICovCiAjZGVmaW5lIE1YMUZTMl9GTEFTSF9JTlRFUkxFQVZFIDEJLyogLi4uIG1hZGUgb2YgMSBjaGlwICovCkBAIC0xNjcsOSArMTYyLDI4IEBACiAgKiBmb290cHJpbnQuCiAgKiBOT1RFOiBFbmFibGUgQ0ZHX0NNRF9KRkZTMiBmb3IgSkZGUzIgc3VwcG9ydC4KICAqLwotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSwkJMAotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfU0VDVE9SCQk1Ci0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJCTEKKworLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisvKgorI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDUwMDAwCisqLworCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworLyogTm90ZTogZmFrZSBtdGRfaWQgdXNlZCwgbm8gbGludXggbXRkIG1hcCBmaWxlICovCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1teDFmczItMCIKKworI2lmZGVmIEJVUzMyQklUX1ZFUlNJT04KKyNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9bXgxZnMyLTA6Mm1ANW0ocGFydDApLDVtQDltKHBhcnQxKSIKKyNlbHNlCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPW14MWZzMi0wOi1AMzIwayhqZmZzMikiCisjZW5kaWYKIAogLyoKICAqIEVudmlyb25tZW50IHNldHVwLiBEZWZpbml0aW9ucyBvZiBtb25pdG9yIGxvY2F0aW9uIGFuZCBzaXplIHdpdGgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmggYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MjBoNC5oCmluZGV4IDQ3Zjc4ZmEuLmM3OTE2MDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaApAQCAtMjY1LDEwICsyNjUsMjMgQEAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQgICAgICgzMCo3NSpDRkdfSFopIC8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovCiAjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUICAgICAoMzAqNzUqQ0ZHX0haKSAvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAqLwogCi0vKiBGbGFzaCBiYW5rcyBKRkZTMiBzaG91bGQgdXNlICovCi0jZGVmaW5lIENGR19NQVhfTVREX0JBTktTCShDRkdfTUFYX0ZMQVNIX0JBTktTK0NGR19NQVhfTkFORF9ERVZJQ0UpCiAjZGVmaW5lIENGR19KRkZTMl9NRU1fTkFORAotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSwkxCQkvKiB1c2UgZmxhc2hfaW5mb1sxXSAqLwotI2RlZmluZSBDRkdfSkZGUzJfTlVNX0JBTktTICAgICAxCisKKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24sIHdob2xlIGRldmljZSAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IxIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKiBOb3RlOiBmYWtlIG10ZF9pZCB1c2VkLCBubyBsaW51eCBtdGQgbWFwIGZpbGUgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMT1vbWFwMjQyMC0xIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1vbWFwMjQyMC0xOi0oamZmczIpIgorKi8KIAogI2VuZGlmCQkJCQkJCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYzUyMF9jZHAuaCBiL2luY2x1ZGUvY29uZmlncy9zYzUyMF9jZHAuaAppbmRleCA3NjRlZmRmLi5kN2QwN2E2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfY2RwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NjNTIwX2NkcC5oCkBAIC0xMzgsOCArMTM4LDIyIEBACiAjZGVmaW5lIENPTkZJR19TQzUyMF9DRFBfVVNFX1NQSSAgLyogU3RvcmUgY29uZmlndXJhdGlvbiBpbiB0aGUgU1BJIHBhcnQgKi8KICN1bmRlZiBDT05GSUdfU0M1MjBfQ0RQX1VTRV9NVyAgICAvKiBTdG9yZSBjb25maWd1cmF0aW9uIGluIHRoZSBNaWNyb1dpcmUgcGFydCAqLwogI2RlZmluZSBDT05GSUdfU1BJX1ggMQotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSyAgICAwICAgICAgICAgICAvKiB1c2UgZm9yIEpGRlMyICovCi0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MgICAgIDEgICAgICAgICAgIC8qICAqLworCisvKgorICogSkZGUzIgcGFydGl0aW9ucworICovCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uLCB3aG9sZSBkZXZpY2UgKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yMCIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHhGRkZGRkZGRgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDAwMDAwMAorCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPVNDNTIwQ0RQIEZsYXNoIEJhbmsgIzAiCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPVNDNTIwQ0RQIEZsYXNoIEJhbmsgIzA6LShqZmZzMikiCisqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEZXZpY2UgZHJpdmVycwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NjNTIwX3NwdW5rLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfc3B1bmsuaAppbmRleCA0MTE0ZGQzLi5hOGUzNTU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfc3B1bmsuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfc3B1bmsuaApAQCAtMTQ3LDggKzE0NywyMyBAQAogCiAjZW5kaWYKIAotI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSyAgICAwICAgICAgICAgICAvKiB1c2UgZm9yIEpGRlMyICovCi0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MgICAgIDEgICAgICAgICAgIC8qICAqLworLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqCisgKi8KKy8qIE5vIGNvbW1hbmQgbGluZSwgb25lIHN0YXRpYyBwYXJ0aXRpb24sIHdob2xlIGRldmljZSAqLworI3VuZGVmIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIENPTkZJR19KRkZTMl9ERVYJCSJub3IwIgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9TSVpFCQkweEZGRkZGRkZGCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX09GRlNFVAkweDAwMDAwMDAwCisKKy8qIG10ZHBhcnRzIGNvbW1hbmQgbGluZSBzdXBwb3J0ICovCisvKiBOb3RlOiBmYWtlIG10ZF9pZCB1c2VkLCBubyBsaW51eCBtdGQgbWFwIGZpbGUgKi8KKy8qCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCisjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1zYzUyMF9zcHVuay0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1zYzUyMF9zcHVuay0wOi0oamZmczIpIgorKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRGV2aWNlIGRyaXZlcnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy92MzcuaCBiL2luY2x1ZGUvY29uZmlncy92MzcuaAppbmRleCA0NWJjMzUzLi5iM2M2MjU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdjM3LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3YzNy5oCkBAIC04NywxMCArODcsMjMgQEAKIAkJCQlDRkdfQ01EX0pGRlMyCXwgXAogCQkJCUNGR19DTURfREFURQkpCiAKKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKgorICovCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uLCB3aG9sZSBkZXZpY2UgKi8KKyN1bmRlZiBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBDT05GSUdfSkZGUzJfREVWCQkibm9yMSIKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfU0laRQkJMHhGRkZGRkZGRgorI2RlZmluZSBDT05GSUdfSkZGUzJfUEFSVF9PRkZTRVQJMHgwMDAwMDAwMAogCi0vKiBGbGFzaCBiYW5rcyBKRkZTMiBzaG91bGQgdXNlICovCi0jZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCTEKLSNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUwkxCisvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLworLyogTm90ZTogZmFrZSBtdGRfaWQgdXNlZCwgbm8gbGludXggbXRkIG1hcCBmaWxlICovCisvKgorI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQorI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjE9djM3LTEiCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPXYzNy0xOi0oamZmczIpIgorKi8KIAogLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwogI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3ZvaWNlYmx1ZS5oIGIvaW5jbHVkZS9jb25maWdzL3ZvaWNlYmx1ZS5oCmluZGV4IDE2NDAxNjMuLjcyYjBhNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy92b2ljZWJsdWUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvdm9pY2VibHVlLmgKQEAgLTI0Nyw0ICsyNDcsMjIgQEAKIAogI2RlZmluZSBWT0lDRUJMVUVfTEVEX1JFRwkweDA0MDMwMDAwCiAKKy8qCisgKiBKRkZTMiBwYXJ0aXRpb25zCisgKgorICovCisvKiBObyBjb21tYW5kIGxpbmUsIG9uZSBzdGF0aWMgcGFydGl0aW9uICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwNDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qIE5vdGU6IGZha2UgbXRkX2lkIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZSAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPXZvaWNlYmx1ZS0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz12b2ljZWJsdWUtMDoxMjhrKHVib290KSw2NGsoZW52KSw2NGsocmVudiksLShqZmZzMikiCisqLworCiAjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3hzZW5naW5lLmggYi9pbmNsdWRlL2NvbmZpZ3MveHNlbmdpbmUuaAppbmRleCA4NDdlOTFhLi5kYzcwMmNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MveHNlbmdpbmUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MveHNlbmdpbmUuaApAQCAtNTksOSArNTksMjMgQEAKICNkZWZpbmUgUEhZU19GTEFTSF8yCQkJMHgwMDAwMDAwMAkvKiBGbGFzaCBCYW5rICMyICovCiAjZGVmaW5lIFBIWVNfRkxBU0hfU0VDVF9TSVpFCQkweDAwMDIwMDAwCS8qIDEyNyBLQiBzZWN0b3JzICovCiAjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkJUEhZU19GTEFTSF8xCi0jZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJCTEKLSNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJCTAKLSNkZWZpbmUgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQJCTEKKworLyoKKyAqIEpGRlMyIHBhcnRpdGlvbnMKKyAqLworLyogTm8gY29tbWFuZCBsaW5lLCBvbmUgc3RhdGljIHBhcnRpdGlvbiwgd2hvbGUgZGV2aWNlICovCisjdW5kZWYgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0RFVgkJIm5vcjAiCisjZGVmaW5lIENPTkZJR19KRkZTMl9QQVJUX1NJWkUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgQ09ORklHX0pGRlMyX1BBUlRfT0ZGU0VUCTB4MDAwMDAwMDAKKworLyogbXRkcGFydHMgY29tbWFuZCBsaW5lIHN1cHBvcnQgKi8KKy8qIE5vdGU6IGZha2UgbXRkX2lkIHVzZWQsIG5vIGxpbnV4IG10ZCBtYXAgZmlsZSAqLworLyoKKyNkZWZpbmUgQ09ORklHX0pGRlMyX0NNRExJTkUKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPXhzZW5naW5lLTAiCisjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPXhzZW5naW5lLTA6MjU2ayh1Ym9vdCksMW0oa2VybmVsMSksOG0oa2VybmVsMikiCisqLwogCiAvKiBFbnZpcm9ubWVudCBzZXR0aW5ncyAqLwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9qZmZzMi9sb2FkX2tlcm5lbC5oIGIvaW5jbHVkZS9qZmZzMi9sb2FkX2tlcm5lbC5oCmluZGV4IGQ4YjQyNDAuLjg4MmE4MGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvamZmczIvbG9hZF9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2pmZnMyL2xvYWRfa2VybmVsLmgKQEAgLTI1LDQwICsyNSwzNyBAQAogICoKICAqLwogCi0vKiB0aGlzIHN0cnVjdCBpcyB2ZXJ5IHNpbWlsYXIgdG8gbXRkX2luZm8gKi8KLXN0cnVjdCBwYXJ0X2luZm8gewotCXUzMiBzaXplOwkgLyogVG90YWwgc2l6ZSBvZiB0aGUgUGFydGl0aW9uICovCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCi0JLyogIk1ham9yIiBlcmFzZSBzaXplIGZvciB0aGUgZGV2aWNlLiBOYe92ZSB1c2VycyBtYXkgdGFrZSB0aGlzCi0JICogdG8gYmUgdGhlIG9ubHkgZXJhc2Ugc2l6ZSBhdmFpbGFibGUsIG9yIG1heSB1c2UgdGhlIG1vcmUgZGV0YWlsZWQKLQkgKiBpbmZvcm1hdGlvbiBiZWxvdyBpZiB0aGV5IGRlc2lyZQotCSAqLwotCXUzMiBlcmFzZXNpemU7CisvKiBtdGQgZGV2aWNlIHR5cGVzICovCisjZGVmaW5lIE1URF9ERVZfVFlQRV9OT1IgICAgICAweDAwMDEKKyNkZWZpbmUgTVREX0RFVl9UWVBFX05BTkQgICAgIDB4MDAwMgorI2RlZmluZSBNVERfREVWX1RZUEUodHlwZSkgKCh0eXBlID09IE1URF9ERVZfVFlQRV9OQU5EKSA/ICJuYW5kIiA6ICJub3IiKQogCi0JLyogV2hlcmUgaW4gbWVtb3J5IGRvZXMgdGhpcyBwYXJ0aXRpb24gc3RhcnQ/ICovCi0JY2hhciAqb2Zmc2V0OwotCi0JLyogdXNlZCBieSBqZmZzMiBzZXQgdG8gTlVMTCAqLwotCXZvaWQgKmpmZnMyX3ByaXY7Ci0KLQkvKiBwcml2YXRlIGZpbGVkIHVzZWQgYnkgdXNlciAqLwotCXZvaWQgKnVzcl9wcml2Oworc3RydWN0IG10ZF9kZXZpY2UgeworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKKwlzdHJ1Y3QgbXRkaWRzICppZDsJCS8qIHBhcmVudCBtdGQgaWQgZW50cnkgKi8KKwl1MTYgbnVtX3BhcnRzOwkJCS8qIG51bWJlciBvZiBwYXJ0aXRpb25zIG9uIHRoaXMgZGV2aWNlICovCisJc3RydWN0IGxpc3RfaGVhZCBwYXJ0czsJCS8qIHBhcnRpdGlvbnMgKi8KIH07CiAKLXN0cnVjdCBwYXJ0X2luZm8qCi1qZmZzMl9wYXJ0X2luZm8oaW50IHBhcnRfbnVtKTsKK3N0cnVjdCBwYXJ0X2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKKwljaGFyICpuYW1lOwkJCS8qIHBhcnRpdGlvbiBuYW1lICovCisJdTggYXV0b19uYW1lOwkJCS8qIHNldCB0byAxIGZvciBnZW5lcmF0ZWQgbmFtZSAqLworCXUzMiBzaXplOwkJCS8qIHRvdGFsIHNpemUgb2YgdGhlIHBhcnRpdGlvbiAqLworCXUzMiBvZmZzZXQ7CQkJLyogb2Zmc2V0IHdpdGhpbiBkZXZpY2UgKi8KKwl2b2lkICpqZmZzMl9wcml2OwkJLyogdXNlZCBpbnRlcm5hbHkgYnkgamZmczIgKi8KKwl1MzIgbWFza19mbGFnczsJCQkvKiBrZXJuZWwgTVREIG1hc2sgZmxhZ3MgKi8KKwlzdHJ1Y3QgbXRkX2RldmljZSAqZGV2OwkJLyogcGFyZW50IGRldmljZSAqLworfTsKIAotc3RydWN0IGtlcm5lbF9sb2FkZXIgewotCi0JLyogUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBrZXJuZWwgY29udGFpbmVkIGF0IHNyYyAqLwotCWludCAoKiBjaGVja19tYWdpYykoc3RydWN0IHBhcnRfaW5mbyAqcGFydCk7Ci0KLQkvKiBsb2FkIHRoZSBrZXJuZWwgZnJvbSB0aGUgcGFydGl0aW9uIHBhcnQgdG8gZHN0LCByZXR1cm4gdGhlIG51bWJlcgotCSAqIG9mIGJ5dGVzIGNvcGllZCBpZiBzdWNjZXNzZnVsLCB6ZXJvIGlmIG5vdCAqLwotCXUzMiAoKiBsb2FkX2tlcm5lbCkodTMyICpkc3QsIHN0cnVjdCBwYXJ0X2luZm8gKnBhcnQsIGNvbnN0IGNoYXIgKmtlcm5lbF9maWxlbmFtZSk7Ci0KLQkvKiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBtb2R1bGUgKGllLCAiY3JhbWZzIikgKi8KLQljaGFyICpuYW1lOworc3RydWN0IG10ZGlkcyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXU4IHR5cGU7CQkJLyogZGV2aWNlIHR5cGUgKi8KKwl1OCBudW07CQkJCS8qIGRldmljZSBudW1iZXIgKi8KKwl1MzIgc2l6ZTsJCQkvKiBkZXZpY2Ugc2l6ZSAqLworCWNoYXIgKm10ZF9pZDsJCQkvKiBsaW51eCBrZXJuZWwgZGV2aWNlIGlkICovCiB9OwogCiAjZGVmaW5lIGxkcl9zdHJsZW4Jc3RybGVuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpc3QuaCBiL2luY2x1ZGUvbGludXgvbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTdkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2xpc3QuaApAQCAtMCwwICsxLDI1OCBAQAorI2lmbmRlZiBfTElOVVhfTElTVF9ICisjZGVmaW5lIF9MSU5VWF9MSVNUX0gKKworI2lmbmRlZiBBUkNIX0hBU19QUkVGRVRDSAorI2RlZmluZSBBUkNIX0hBU19QUkVGRVRDSAorc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNoKGNvbnN0IHZvaWQgKngpIHs7fQorI2VuZGlmCisKKy8qCisgKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIFNvbWUgb2YgdGhlIGludGVybmFsIGZ1bmN0aW9ucyAoIl9feHh4IikgYXJlIHVzZWZ1bCB3aGVuCisgKiBtYW5pcHVsYXRpbmcgd2hvbGUgbGlzdHMgcmF0aGVyIHRoYW4gc2luZ2xlIGVudHJpZXMsIGFzCisgKiBzb21ldGltZXMgd2UgYWxyZWFkeSBrbm93IHRoZSBuZXh0L3ByZXYgZW50cmllcyBhbmQgd2UgY2FuCisgKiBnZW5lcmF0ZSBiZXR0ZXIgY29kZSBieSB1c2luZyB0aGVtIGRpcmVjdGx5IHJhdGhlciB0aGFuCisgKiB1c2luZyB0aGUgZ2VuZXJpYyBzaW5nbGUtZW50cnkgcm91dGluZXMuCisgKi8KKworc3RydWN0IGxpc3RfaGVhZCB7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCwgKnByZXY7Cit9OworCisjZGVmaW5lIExJU1RfSEVBRF9JTklUKG5hbWUpIHsgJihuYW1lKSwgJihuYW1lKSB9CisKKyNkZWZpbmUgTElTVF9IRUFEKG5hbWUpIFwKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5hbWUgPSBMSVNUX0hFQURfSU5JVChuYW1lKQorCisjZGVmaW5lIElOSVRfTElTVF9IRUFEKHB0cikgZG8geyBcCisJKHB0ciktPm5leHQgPSAocHRyKTsgKHB0ciktPnByZXYgPSAocHRyKTsgXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBiZXR3ZWVuIHR3byBrbm93biBjb25zZWN1dGl2ZSBlbnRyaWVzLiAKKyAqCisgKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwcmV2LAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbmV4dCkKK3sKKwluZXh0LT5wcmV2ID0gbmV3OworCW5ldy0+bmV4dCA9IG5leHQ7CisJbmV3LT5wcmV2ID0gcHJldjsKKwlwcmV2LT5uZXh0ID0gbmV3OworfQorCisvKioKKyAqIGxpc3RfYWRkIC0gYWRkIGEgbmV3IGVudHJ5CisgKiBAbmV3OiBuZXcgZW50cnkgdG8gYmUgYWRkZWQKKyAqIEBoZWFkOiBsaXN0IGhlYWQgdG8gYWRkIGl0IGFmdGVyCisgKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGFmdGVyIHRoZSBzcGVjaWZpZWQgaGVhZC4KKyAqIFRoaXMgaXMgZ29vZCBmb3IgaW1wbGVtZW50aW5nIHN0YWNrcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKm5ldywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xpc3RfYWRkKG5ldywgaGVhZCwgaGVhZC0+bmV4dCk7Cit9CisKKy8qKgorICogbGlzdF9hZGRfdGFpbCAtIGFkZCBhIG5ldyBlbnRyeQorICogQG5ldzogbmV3IGVudHJ5IHRvIGJlIGFkZGVkCisgKiBAaGVhZDogbGlzdCBoZWFkIHRvIGFkZCBpdCBiZWZvcmUKKyAqCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYmVmb3JlIHRoZSBzcGVjaWZpZWQgaGVhZC4KKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgcXVldWVzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9hZGRfdGFpbChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJX19saXN0X2FkZChuZXcsIGhlYWQtPnByZXYsIGhlYWQpOworfQorCisvKgorICogRGVsZXRlIGEgbGlzdCBlbnRyeSBieSBtYWtpbmcgdGhlIHByZXYvbmV4dCBlbnRyaWVzCisgKiBwb2ludCB0byBlYWNoIG90aGVyLgorICoKKyAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGlzdCBtYW5pcHVsYXRpb24gd2hlcmUgd2Uga25vdworICogdGhlIHByZXYvbmV4dCBlbnRyaWVzIGFscmVhZHkhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKnByZXYsIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQpCit7CisJbmV4dC0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IG5leHQ7Cit9CisKKy8qKgorICogbGlzdF9kZWwgLSBkZWxldGVzIGVudHJ5IGZyb20gbGlzdC4KKyAqIEBlbnRyeTogdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKiBOb3RlOiBsaXN0X2VtcHR5IG9uIGVudHJ5IGRvZXMgbm90IHJldHVybiB0cnVlIGFmdGVyIHRoaXMsIHRoZSBlbnRyeSBpcyBpbiBhbiB1bmRlZmluZWQgc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2RlbChzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSkKK3sKKwlfX2xpc3RfZGVsKGVudHJ5LT5wcmV2LCBlbnRyeS0+bmV4dCk7CisJZW50cnktPm5leHQgPSAodm9pZCAqKSAwOworCWVudHJ5LT5wcmV2ID0gKHZvaWQgKikgMDsKK30KKworLyoqCisgKiBsaXN0X2RlbF9pbml0IC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxpc3QgYW5kIHJlaW5pdGlhbGl6ZSBpdC4KKyAqIEBlbnRyeTogdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2RlbF9pbml0KHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKKwlJTklUX0xJU1RfSEVBRChlbnRyeSk7IAorfQorCisvKioKKyAqIGxpc3RfbW92ZSAtIGRlbGV0ZSBmcm9tIG9uZSBsaXN0IGFuZCBhZGQgYXMgYW5vdGhlcidzIGhlYWQKKyAqIEBsaXN0OiB0aGUgZW50cnkgdG8gbW92ZQorICogQGhlYWQ6IHRoZSBoZWFkIHRoYXQgd2lsbCBwcmVjZWRlIG91ciBlbnRyeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9tb3ZlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisgICAgICAgIF9fbGlzdF9kZWwobGlzdC0+cHJldiwgbGlzdC0+bmV4dCk7CisgICAgICAgIGxpc3RfYWRkKGxpc3QsIGhlYWQpOworfQorCisvKioKKyAqIGxpc3RfbW92ZV90YWlsIC0gZGVsZXRlIGZyb20gb25lIGxpc3QgYW5kIGFkZCBhcyBhbm90aGVyJ3MgdGFpbAorICogQGxpc3Q6IHRoZSBlbnRyeSB0byBtb3ZlCisgKiBAaGVhZDogdGhlIGhlYWQgdGhhdCB3aWxsIGZvbGxvdyBvdXIgZW50cnkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZV90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworICAgICAgICBfX2xpc3RfZGVsKGxpc3QtPnByZXYsIGxpc3QtPm5leHQpOworICAgICAgICBsaXN0X2FkZF90YWlsKGxpc3QsIGhlYWQpOworfQorCisvKioKKyAqIGxpc3RfZW1wdHkgLSB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eQorICogQGhlYWQ6IHRoZSBsaXN0IHRvIHRlc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxpc3RfZW1wdHkoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gaGVhZC0+bmV4dCA9PSBoZWFkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X3NwbGljZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0ID0gbGlzdC0+bmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0ID0gbGlzdC0+cHJldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICphdCA9IGhlYWQtPm5leHQ7CisKKwlmaXJzdC0+cHJldiA9IGhlYWQ7CisJaGVhZC0+bmV4dCA9IGZpcnN0OworCisJbGFzdC0+bmV4dCA9IGF0OworCWF0LT5wcmV2ID0gbGFzdDsKK30KKworLyoqCisgKiBsaXN0X3NwbGljZSAtIGpvaW4gdHdvIGxpc3RzCisgKiBAbGlzdDogdGhlIG5ldyBsaXN0IHRvIGFkZC4KKyAqIEBoZWFkOiB0aGUgcGxhY2UgdG8gYWRkIGl0IGluIHRoZSBmaXJzdCBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlpZiAoIWxpc3RfZW1wdHkobGlzdCkpCisJCV9fbGlzdF9zcGxpY2UobGlzdCwgaGVhZCk7Cit9CisKKy8qKgorICogbGlzdF9zcGxpY2VfaW5pdCAtIGpvaW4gdHdvIGxpc3RzIGFuZCByZWluaXRpYWxpc2UgdGhlIGVtcHRpZWQgbGlzdC4KKyAqIEBsaXN0OiB0aGUgbmV3IGxpc3QgdG8gYWRkLgorICogQGhlYWQ6IHRoZSBwbGFjZSB0byBhZGQgaXQgaW4gdGhlIGZpcnN0IGxpc3QuCisgKgorICogVGhlIGxpc3QgYXQgQGxpc3QgaXMgcmVpbml0aWFsaXNlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2VfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCWlmICghbGlzdF9lbXB0eShsaXN0KSkgeworCQlfX2xpc3Rfc3BsaWNlKGxpc3QsIGhlYWQpOworCQlJTklUX0xJU1RfSEVBRChsaXN0KTsKKwl9Cit9CisKKy8qKgorICogbGlzdF9lbnRyeSAtIGdldCB0aGUgc3RydWN0IGZvciB0aGlzIGVudHJ5CisgKiBAcHRyOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgcG9pbnRlci4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGlzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgXAorCSgodHlwZSAqKSgoY2hhciAqKShwdHIpLSh1bnNpZ25lZCBsb25nKSgmKCh0eXBlICopMCktPm1lbWJlcikpKQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dCwgcHJlZmV0Y2gocG9zLT5uZXh0KTsgcG9zICE9IChoZWFkKTsgXAorICAgICAgICAJcG9zID0gcG9zLT5uZXh0LCBwcmVmZXRjaChwb3MtPm5leHQpKQorLyoqCisgKiBsaXN0X2Zvcl9lYWNoX3ByZXYJLQlpdGVyYXRlIG92ZXIgYSBsaXN0IGJhY2t3YXJkcworICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfcHJldihwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+cHJldiwgcHJlZmV0Y2gocG9zLT5wcmV2KTsgcG9zICE9IChoZWFkKTsgXAorICAgICAgICAJcG9zID0gcG9zLT5wcmV2LCBwcmVmZXRjaChwb3MtPnByZXYpKQorICAgICAgICAJCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfc2FmZQktCWl0ZXJhdGUgb3ZlciBhIGxpc3Qgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeQorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBuOgkJYW5vdGhlciAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dCwgbiA9IHBvcy0+bmV4dDsgcG9zICE9IChoZWFkKTsgXAorCQlwb3MgPSBuLCBuID0gcG9zLT5uZXh0KQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfZW50cnkJLQlpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBtZW1iZXIpCQkJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKKwkJICAgICBwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KTsJCQlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyAJCQkJCVwKKwkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCkpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIC0gaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBuOgkJYW5vdGhlciB0eXBlICogdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCBoZWFkLCBtZW1iZXIpCQkJXAorCWZvciAocG9zID0gbGlzdF9lbnRyeSgoaGVhZCktPm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAorCQluID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAkJCQkJXAorCSAgICAgcG9zID0gbiwgbiA9IGxpc3RfZW50cnkobi0+bWVtYmVyLm5leHQsIHR5cGVvZigqbiksIG1lbWJlcikpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSAtICAgICAgIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVpbmcgYWZ0ZXIgZXhpc3RpbmcgcG9pbnQKKyAqIEBwb3M6ICAgICAgICB0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOiAgICAgICB0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjogICAgIHRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHBvcywgaGVhZCwgbWVtYmVyKQkJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCk7CQkJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJCQkJCVwKKwkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCkpCisKKyNlbmRpZgo=